Q&A-言語仕様編 |
VBの文法や関数の使い方に関する質問をまとめました。
Val("&H8000") で 正の値を取得するには、どうすれば良いのでしょう
プログラムの無限ループを中断するには
クラスはどのような時に使うのですか?
構造体を初期化する良い方法はありますか?
コントロール配列を関数の引数にするには?
N88Basic の MKI$、MKS$、MKD$ で出力したデータを VBで読込みには?
JISコードで取得したデータを、VBで使用できる文字列にするには?
切上げ、切捨て、四捨五入をするには?
浮動小数値からバイトデータを取り出すには
Q Val("&H8000") で 正の値を取得するには、どうすれば良いのでしょう
Val("&H8000") 関数から取得した値は、-32768
になってしまいます。これを Long
型の変数に代入してもマイナスの値のままですが、正の値を取得するにはどうすれば良いでしょうか?
A
文字列の最後に "&" を付けてください
16進数の &H7FFF 以上の文字列を Val 関数に指定した場合は、&H8000 から &H8FFF までが、負の値となってしまいます。これを、正の値にするには、明示的に文字列の型をしている文字を16進数の後に追加してください(この文字を型宣言文字といいます)。次の例を参照してください。
Dim lngValue As Long
lngValue = Val("&H8000&")
Debug.Print lngValue
こうすれば、&H8000 の正の値、32768
が表示されます。同様に文字列の型を指定する場合は、以下の文字を最後に追加してください。
整数型(Integer) %
長整数型 (Long) &
単精度浮動小数点数型 (Single) !
倍精度浮動小数点数型 (Double) #
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
プログラムを保存する前に、無限ループとなってしまいました。なんとかVBを終了させる前に中断できないでしょうか?
A Ctrl + Break
を押してください
あわてて、タスクマネージャで VB
を終了させる必要はありません。
プログラムを中断するには、メニューの[実行]−[中断]のショートカットである
Ctrl + Break を押してください。
それと、プログラムでループの危険性がある場合は、予めループの中に
DoEvents を入れておきましょう。DoEvents
を入れておけば、メニューやボタンが操作できます。
Do
:
:
DoEvents
:
:
Loop
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
VBの入門編の書籍を見ていても、クラスの使い方が書いてありません。どのような時にクラスは使うのでしょうか?
A
同じ様なコードを繰返し書く時に使用してください
クラスといえば、オブジェクト指向です(^^。でもそんなに難しく考えないでください。ただ同じようなコーディンゴを何回も書かなければならないような時に効率良くプログラムを書く為に使用すると考えてください。
では、どんな時に、どのようにして効率よくプログラムを書くのでしょうか?
例えば、次のようなケースを考えてください。
・ファイルからデータを一行ずつ読み込む
・読み込んだデータを出力モードによってファイル、プリンタ、通信のいずれかに送る
■ クラスを使わない場合
クラスを使用しない場合、次のようなコーディングが考えられます。
Open 読込むファイル名 For Input As #1
Select Case 出力モード
Case ファイル
出力ファイルのオープン
Do While Not EOF(1)
Line Input #1, InputData
ファイルへ出力
Loop
出力ファイルのクローズ
Case プリンタ
印刷ダイアログの表示
Do While Not EOF(1)
Line Input #1, InputData
プリンタへ出力
Loop
出力ファイルのクローズ
Case 通信
通信の初期設定
Do While Not EOF(1)
Line Input #1, InputData
通信ポートへ出力
Loop
通信ポートの解放
End Select
Close #1
なんか、同じようなコーディングを3回書いてますますが(^^;
もしデータの読込み方が変わったらどうするのでしょうか?
3個所に同じような修正をしなければなりません(^^;
それと、出力ファイルのオープンや印刷ダイアログの表示などを関数にすると、次のような関数が必要です。
OpenFile -- 出力ファイルのオープン
WriteFile -- ファイルへ出力
CloseFile -- 出力ファイルのクローズ
OpenPrinter -- 印刷ダイアログの表示
WritePrinter -- プリンタへ出力
ClosePrinter -- 出力ファイルのクローズ
OpenComm -- 通信の初期設定
WriteComm -- 通信ポートへ出力
CloseComm -- 通信ポートの解放
これだと、名前を考えたり、覚えるのに苦労しそうですね(^^;
■ クラスを使用した場合
クラスを使用すると、データ型と関数を、まとめて定義することができます。例えば、上記の場合は、次のようなクラスと関数にまとめることができます。
・ファイルクラス
XOpen -- 出力ファイルのオープン
XWrite -- ファイルへ出力
XClose -- 出力ファイルのクローズ
・プリンタクラス
XOpen -- 印刷ダイアログの表示
XWrite -- プリンタへ出力
XClose -- 出力ファイルのクローズ
・通信クラス
XOpen -- 通信の初期設定
XWrite -- 通信ポートへ出力
XClose -- 通信ポートの解放
もう気づいているかもしれませんが、同じ名前が使えます。
このクラスを使って、上記のコーディングをすると、次のようになります。
Dim obj As Object
Open 読込むファイル名 For Input As #1
Select Case 出力モード
Case ファイル
Set obj = New ファイルクラス
Case プリンタ
Set obj = New プリンタクラス
Case 通信
Set obj = New 通信クラス
End Select
obj.XOpen
Do While Not EOF(1)
Line Input #1, InputData
obj.XWrite
Loop
obj.XClose
Set obj = Nothing
Close #1
どうです、すっきりしたでしょう(^^。同じようなコーディングがほとんど無くなりました。つまりクラスを使うのは数学の因数分解をしてるようなものです(^^。見た目の問題だけでなく、同じようなコーディングを修正する必要もありません。また、新しいクラスを作れば楽に機能拡張ができます。
それでは、簡単にクラスの作り方を解説しましょう。
1. メニューの [プロジェクト]-[クラスモジュールの追加]
を選択して、クラスを作成します。
2.
クラスのプロパティでオブジェクト名(クラスの名前)を指定します
(例 -- clsFile , clsPrinter, clsComm)。
3.
クラスの変数や関数を定義します。定義方法は、標準モジュールと同じです。
4. クラスを使用する場合には、Dim
変数名 As クラス名
と宣言します(Public や Private
などでもOK)。ただし、この変数名はクラスを参照するための変数で、まだ実体がありません。
(例 -- Dim objFile As
clsFile)
5. 実体を作る場合には、Set 変数名
= New クラス名
を書きます。これで、各クラスの変数や関数を使用する事ができます。
(例 -- Set objFile = New
clsFile)
(Point) 4. 5. を省略して Dim 変数名 As New クラス名 と書く事もできます。
6.
クラスの変数や関数を使用する場合は、上記の変数名を使って 変数名.クラスの関数名
や 変数名.クラスの変数名 の形式で使用します。
(例 -- objFile.XOpen, objFile.XClose)
7. Object型で宣言した変数には、全てのクラスの変数が Set Object型の変数名 = クラスの変数名
の形式で代入できます。ただし、この代入はクラスの参照を代入しているので、別のObject型の変数に代入しても、元クラスの内容が書きかえられると、Object型の変数全ての内容が変わります。
Dim obj1 As Object
Dim obj2 As Object
Dim objTest As New clsTest
Set obj1 = objTest
Set obj2 = objTest
obj1.strName = "1234"
' obj2 の内容は obj1.strNam と同じになる
Debug.Print obj1.strName
Debug.Print obj2.strName
8. 最後に使用済のクラスは Set
変数名 = Nothing
で解放しておきます。
(例 -- Set objFile = Nothing)
クラスを使うと、この他にも便利なコレクションの機能も使用できます。でひとも、一度挑戦してみてください!
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
構造体を初期化するには、構造体のメンバ変数1つ1つに値を設定する必要がありますが、一度に初期化する方法はありませんか?
A
ローカル変数を代入すれば一度に初期化できます
Dim で宣言した VB のローカル変数は、宣言をした時点で VB のデフォルト値に初期化されます。この性質を利用して、ローカル変数を宣言して代入すれば、一度に構造体の初期化ができます。例えば、次のような構造体が標準モジュールに定義されていた場合、
Type PERSON
strName As String
strZip As String
strAddress As String
strTel As String
intAge As Integer
strMail As String
End Type
Public gPerson As PERSON
プログラムで gPerson にデータをセットした後に、この構造体の初期化を行う場合、以下のようなコードを書きますが、
gPerson.strName = ""
gPerson.strZip = ""
gPerson.strAddress = ""
gPerson.strTel = ""
gPerson.intAge = 0
gPerson.strMail = ""
代わりに以下のようにローカル変数を代入すれば、一度に初期化できます。
Dim p As PERSON
gPerson = p
ただし、この初期化は、数値は 0 、文字列は ""
のように変数のデフォルト値に初期化する場合のみ有効です。
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
フォーム上に作成した、テキストの配列等を関数の引数に渡すと、「ユーザー定義型か配列を指定して下さい」というエラーになってしまいます。どうにか引数にコントロールの配列を渡す方法は、あるのでしょうか?
A Variant
型で渡せます
以下のような形式で関数の引数に、TextBox型の配列を渡しても、「ユーザー定義型か配列を指定して下さい」というエラーになってしまいます。
Sub Main()
Call Func(Text1())
End Sub
Function Func(txt() As TextBox) As Boolean
:
:
End Function
この場合、TextBox 型ではなく、以下のように Variant 型を指定し、変数名の () も指定しないでください。
Function Func(txt As Variant) As Boolean
:
:
End Function
Variant 型で取得した変数は、そのまま配列として使用できます。
Function Func(txt As Variant) As Boolean
Dim i As Integer
For i = txt.LBound To txt.UBound
Debug.Print txt(i).Text
Next
End Function
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
Q N88Basic の MKI$、MKS$、MKD$ で出力したデータを VBで読込みには?
N88Basic の MKI$、MKS$、MKD$
で出力したで作成したランダムファイルのデータを、VBで読込みには、どうしたらよいでしょうか?
A
バイナリで読込んで、CVI、CVS、CVD に相当する関数を作成します
N88Basic の MKI$、MKS$、MKD$
で出力したで作成したランダムファイルのデータは、N88Basic では、CVI、CVS、CVD
で変換できますが、VBには同等の機能がありません。そこで VB で、CVI、CVS、CVD
に相当する関数を作成すれば、データを変換することができます。
その前に、まずN88Basic
で作成したファイルのデータを読込む必要があります。そこで、以下の点に気を付けてください。
● MKI$ で出力した場合は、そのまま Integer型
のデータとして取り込めます。
● MKS$、MKD$ で出力した場合は、Byte型の配列で取り込んでください。String
型で読込んだ場合、取得した文字が Unicode
に変換される為、思った通りの値が取得できません。
それでは、N88Basic側
で以下のような出力をした場合を考えてみましょう。
10 OPEN "C:\TEMP\TEST.DAT" AS #1
20 FIELD #1,2 AS A$, 4 AS B$, 8 AS C$
30 D%=20
40 E!=19.6!
50 F#=19.6#
60 LSET A$=MKI$(D% )
70 LSET B$=MKS$(E!)
80 LSET C$=MKD$(F#)
90 PUT #1
100 CLOSE #1
110 END
このデータをVB側で取得する場合には、以下のようにします。
Dim d As Integer
Dim e(3) As Byte '4バイトの Byte配列
Dim f(7) As Byte '8バイトの Byte配列
Open "C:\TEMP\TEST.DAT" For Binary Access Read As #1
Get #1, , d
Get #1, , e
Get #1, , f
Close #1
これで、データが取得できました。あとは、CVS、CVD に相当する関数を作成します。この関数を作成する場合には、まず、N88Basicでのデータのフォーマットを理解しておく必要があります。まず単精度4バイトの形式ですが、以下のようになっています。
バイト | 1 | 2 | 3 | 4 |
内容 | 指数部 | 仮数部 |
1バイト目は指数部で、指数部は、&H80の下駄が加算されています。つまり、&h7F
は−1、&h7E は−2で &h81 は 1 となります。また、&H80
は特例で数値全体が0であることを示します。
仮数部は、先頭の1ビットが符号となっています。また、2ビット以降が小数点以下の2ビット以降となります。小数点以下の1ビット目は常に1と見なされます。(0.1XXXX
で XXXX が仮数部の2ビット以降)
同様に倍精度8バイトの形式は以下の通りです。
バイト | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
内容 | 指数部 | 仮数部 |
指数部、仮数部の意味は単精度と同じです。
また、インテル系のプロセッサでは、全てのバイトが逆順になるので注意してください。
それでは、上記のバイト配列を Single と Double
に変換するサンプルを紹介します。
' バイト配列を Single に変換
Function ToSingle(b() As Byte) As Single
Dim i As Long
Dim j As Long
Dim bit As Long
Dim byt As Long
Dim exp As Double
Dim man As Double
Dim div As Double
Dim sign As Double
If b(3) = 0 Then
ToSingle = 0#
Exit Function
End If
sign = IIf(b(2) And &H80, -1#, 1#)
b(2) = &H80 Or b(2)
div = 0.5
man = 0#
For i = 2 To 0 Step -1
byt = CLng(b(i))
bit = &H80
For j = 0 To 7
If byt And bit Then
man = man + div
End If
bit = bit \ 2
div = div / 2
Next
Next
exp = 2# ^ CDbl(b(3) - &H80)
ToSingle = sign * man * exp
End Function
' バイト配列を Double に変換
Function ToDouble(b() As Byte) As Double
Dim i As Long
Dim j As Long
Dim bit As Long
Dim byt As Long
Dim exp As Double
Dim man As Double
Dim div As Double
Dim sign As Double
If b(7) = 0 Then
ToDouble = 0#
Exit Function
End If
sign = IIf(b(6) And &H80, -1#, 1#)
b(6) = &H80 Or b(6)
div = 0.5
man = 0#
For i = 6 To 0 Step -1
byt = CLng(b(i))
bit = &H80
For j = 0 To 7
If byt And bit Then
man = man + div
End If
bit = bit \ 2
div = div / 2
Next
Next
exp = 2# ^ CDbl(b(7) - &H80)
ToDouble = sign * man * exp
End Function
最後に、先ほどの読込んだデータを、この関数で変換してみましょう。
Dim d As Integer
Dim e(3) As Byte '4バイトの Byte配列
Dim f(7) As Byte '8バイトの Byte配列
Open "C:\TEMP\TEST.DAT" For Binary Access Read As #1
Get #1, , d
Get #1, , e
Get #1, , f
Close #1
Dim sValue As Single
Dim dValue As Double
sValue = ToSingle(e)
dValue = ToDouble(f)
Debug.Print d
Debug.Print sValue
Debug.Print dValue
(注意)上記のサンプルは、誤差が発生する恐れがあります。充分にテストを行ってあくまでも各自の責任にて、ご使用ください。
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
Q JISコードで取得したデータを、VBで使用できる文字列にするには?
JISコードで取得した漢字のデータを、VBで使用できる文字にするにはどうしたら良いのでしょうか?
A Shift Jis
コードに変換して Chr$ でVBの文字列に変換します
VBで使用する為には、まず ShiftJisのコードか、Unicode
に変換すれば使用できますが、ここでは、Shift Jis
に変換する方法を紹介します。
Shift Jis に変換するには、以下のような関数で変換できます。
Sub Jis2SJis(hi As Integer, lo As Integer)
If hi And 1 Then
If lo < &H60 Then
lo = lo + &H1F
Else
lo = lo + &H20
End If
Else
lo = lo + &H7E
End If
If hi < &H5F Then
hi = (hi + &HE1) \ 2
Else
hi = (hi + &H161) \ 2
End If
End Sub
hi As Integer にはJISコードの上位バイト、lo As Integer にはJISコードの下位バイトをセットしてください。Shift Jis に変換されたコードが hi と lo に返されます。さらに、このコードをVBで使用できる文字にするには、以下のように Chr$ で変換すれば、VBの文字列となります。
Chr$(hi * &h100 + lo)
参考の為に、Shift Jis を Jis コードに変換する関数も紹介します。
Sub SJis2Jis(hi As Integer, lo As Integer)
If hi <= &H9F Then
If lo < &H9F Then
hi = hi * 2 - &HE1
Else
hi = hi * 2 - &HE0
End If
Else
If lo < &H9F Then
hi = hi * 2 - &H161
Else
hi = hi * 2 - &H160
End If
End Iff
If lo < &H7F Then
lo = lo - &H1F
ElseIf lo < &H9F Then
lo = lo - &H20
Else
lo = lo - &H7E
End If
End Sub
(Point)このコードは、変換速度を優先させる為に、IIf
などの関数は使用しないようにしたり、演算回数を少なくしています。
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
切上げ、切捨て、四捨五入をするにはどうしたら良いです。
A Int
関数または Fix 関数を使います
切捨ては、Int
関数の機能そのものです。切上げは、元の値を s とすると、-Int(-s)
で計算できます。四捨五入は、元の値に 0.5 を加えて、Int
関数を使用すれば計算できます。
以上ことを使用して、サンプルを作成すると次の通りです。
Dim s As Single
For s = -2 To 2 Step 0.1
'元の値
Debug.Print s,
'切上げ
Debug.Print -Int(-s),
'切捨て
Debug.Print Int(s),
'四捨五入
Debug.Print Int(s + 0.5)
Next
小数点以下2桁を切上げたい場合は、元の値を
100倍してから、上記の計算をし、結果を100で割れば計算できます。
また、上記のサンプルを実行すると以下のように、2進数の計算誤差のために、正しく計算できない場合があります。
: 0.9000004 1 0 1 1 2 1 1 <- 1を切上げすると2になっている(^^; 1.2 2 1 1 :
これを確実に行うには、通貨型を使って計算するとより確実にできます。
(Point)通貨型より誤差の少ない計算を行いたい場合は、10進型を使用してください。
Dim s As Currency
For s = -2@ To 2@ Step 0.1@
'元の値
Debug.Print s,
'切上げ
Debug.Print -Int(-s),
'切捨て
Debug.Print Int(s),
'四捨五入
Debug.Print Int(s + 0.5@)
Next
出力結果は、以下のようになります
: 0.9 1 0 1 1 1 1 1 1.1 2 1 1 1.2 2 1 1 :
ところで、上記の方法を使用した場合、負の値はどうなるでしょうか?
: -1.6 -1 -2 -2 -1.5 -1 -2 -1 -1.4 -1 -2 -1 :
元の値が −1.5の場合は、切上げは 1、切捨ては -2、四捨五入は
1 となります。
一見正しそうですが、一般的に切上げ、切捨て、四捨五入は絶対値に対して行うのが慣例のようです。その場合、切捨て、四捨五入は、Int
関数の代わりに、Fix 関数を使用します。ただし、四捨五入の場合は元の値に加える値(0.5)を、元の値の符号に合わせる必要があります。また、切上げに関しては、絶対値で上記の計算を行い、最後に符号を掛けます。
符号を考慮したサンプルは、以下の通りです。
Dim s As Currency
For s = -2@ To 2@ Step 0.1@
'元の値
Debug.Print s,
'切上げ
Debug.Print Sgn(s) * -Int(-Abs(s)),
'切捨て
Debug.Print Fix(s),
'四捨五入
Debug.Print Fix(s + Sgn(s) * 0.5@)
Next
計算結果は次のようになります。
: -1.1 -2 -1 -1 -1 -1 -1 -1 0.9 -1 0 -1 : -0.6 -1 0 -1 -0.5 -1 0 -1 -0.4 -1 0 0 : -0.1 -1 0 0 0 0 0 0 0.1 1 0 0 :
最後に、これらのことをまとめて、関数にしてみました。
' cur を小数点以下 pos 桁目で切上げ
Public Function Floor(cur As Currency, pos As Integer) As Currency
Floor = Sgn(cur) * -Int(-Abs(cur * (10@ ^ pos))) / (10@ ^ pos)
End Function
' cur を小数点以下 pos 桁目で切捨て
Public Function Ceil(cur As Currency, pos As Integer) As Currency
Ceil = Fix(cur * (10@ ^ pos)) / (10@ ^ pos)
End Function
' cur を小数点以下 pos 桁目で四捨五入
Public Function Round(cur As Currency, pos As Integer) As Currency
Round = Fix(cur * (10@ ^ pos) + Sgn(cur) * 0.5@) / (10@ ^ pos)
End Function
より精度の高い計算をしたい場合は、以下の10進型の関数を使用してください。
' dec を小数点以下 pos 桁目で切上げ
Public Function DecFloor(dec As Variant, pos As Integer) As Variant
DecFloor = Sgn(CDec(dec)) * -Int(-Abs(CDec(dec) * (CDec(10) ^ CDec(pos)))) / (CDec(10) ^ CDec(pos))
End Function
' dec を小数点以下 pos 桁目で切捨て
Public Function DecCeil(dec As Variant, pos As Integer) As Variant
DecCeil = Fix(CDec(dec) * (CDec(10) ^ CDec(pos))) / (CDec(10) ^ CDec(pos))
End Function
' dec を小数点以下 pos 桁目で四捨五入
Public Function DecRound(dec As Variant, pos As Integer) As Variant
DecRound = Fix(CDec(dec) * (CDec(10) ^ CDec(pos)) + Sgn(dec) * CDec(0.5)) / (CDec(10) ^ CDec(pos))
End Function
(謝辞)このQ&Aを作成する時に、アドバイスをいただいた
K.Kさん、あXXXXXさん。ありがとうございました。
(注意)このページの内容は、Visual
Basic5.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
Singleで宣言されたされた変数は、4バイトで構成されていますが、各バイトのデータを
Byte型に取出すにはどうしたら良いでしょうか?
A LSet
で取出せます
LSet
を使用するとユーザー定義型の変数を別のユーザー定義型の変数にコピーできます。これを、利用して、特定の型の変数を
Byte型の配列にコピーできます。
早速サンプルを見てみましょう。
Private Type DEF_BYTES
b(64) As Byte
End Type
Private Type DEF_INT
i As Integer
End Type
Private Type DEF_SINGLE
s As Single
End Type
Private Type DEF_DOUBLE
d As Double
End Type
Private Sub Command1_Click()
Dim by As DEF_BYTES
Dim di As DEF_INT
Dim ds As DEF_SINGLE
Dim dd As DEF_DOUBLE
Dim i As Integer
'Interger を Byte の配列に変換
di.i = 1000
LSet by = di
For i = 0 To 1
Debug.Print Hex$(by.b(i))
Next
'Single を Byte の配列に変換
ds.s = 1000
LSet by = ds
For i = 0 To 3
Debug.Print Hex$(by.b(i))
Next
'Double を Byte の配列に変換
dd.d = 1000
LSet by = dd
For i = 0 To 7
Debug.Print Hex$(by.b(i))
Next
End Sub
(注意)このページの内容は、Visual
Basic5.0(SP3) 、Visual Basic6.0(SP3)を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。