VB2005変数と定数
VB2005変数や定数の簡易リファレンス
- 2007.10.24
- 日頃IE使ってないので気づかなかったが、サイドバーと本文が落ちていたの本文文字数を削って修正しました。
個人的備忘録のため真偽の保証はありません。動作未確認のメモもあり。
- メモ:構造体を使って複数のデータを受け渡す。(2007.10.10)
- 私は平気で大域変数を使う。だって大量のデータの受け渡しがめんどくさいじゃないですか?
しかし、サブルーチンや関数定義時に構造体を使えば、複数データを容易に受け渡しが可能である事に気付いた。
引数での構造体利用は以前やった事在るので問題なかったと思う。戻り値も構造体使えると思うので今度試してみよう!
▲上へ
変数・定数の型
型の種類
vb2005 (共通) | 記号 | 型 | Byte | 適用 |
String | - | 文字列型 | P | "文字列" 0〜約20億個のUnicode文字 |
Char | C | 符号無整数 | 2 | 0〜65535(符号なし), "a"〜"z"などchracter code(キャラクタコード) |
Byte | - | バイト型 符号無整数 | 1 | 0〜255(符号なし) |
Short (Int16) | S | 符号付整数 | 2 | -32,768〜32,767(符号付き) |
Integer (Int32) | I/% | 符号付整数 | 4 | -2,147,483,648〜2,147,483,647(符号付き) |
Long (Int64) | L/& | 長整数型 | 8 | -9,223,372,036,854,775,808〜9,223,372,036,854,775,807 (符号付き) Integerでは扱えない、少数のない数 |
Decimal | D/@ | 10進数型 | 8 | 0〜±79,228,162,514,264,337,593,543,950,335 (±7.9...E+28)(小数点なし) 0〜±7.9228162514264337593543950335 (小数点以下28桁) 0以外の最小数 ±0.0000000000000000000000000001(±1E-28) |
Single | F/! | 単精度 浮動小数点 | 4 | Integer程度の桁数の小数のある数 |
Double | 倍精度 浮動小数点 | 8 | Long程度の数値で、小数のある数 | |
Object | オブジェクト型 | 4/32 8/64 P | Integer,String,Booleanなど、任意の型を格納。 取り出し時には型変換 | |
Boolean | - | 論理型 | P | True, False |
date (DateTime) | - | 日付型 | 8 | 0001/01/01 0:0:0AM〜9999/12/31 11:59:59PM 値の指定 "#03/09/2007 5:58PM#" |
SByte | バイト型 符号付整数 | 1 | -128〜127(符号付き)(vb2005以降) | |
UShort (UInt16) | US | 符号無整数 | 2 | 0〜65,535(符号なし)(vb2005以降) |
UInteger (UInt32) | UI | 符号無整数 | 4 | 0〜4,294,967,295(符号なし)(vb2005以降) |
ULong (UInt64) | UL | 符号無整数 | 8 | 0〜18,446,744,073,709,551,615(1.8...E+19) (符号なし)(vb2005以降) |
▲上へ
変数の宣言
配列
要素数を指定して配列変数を宣言する
'*** 配列の宣言(要素数を指定) Dim dec_Arrays(50) As Decimal '要素数51の1次元配列 Dim sho_Arrays(10,5,2) As Short '3次元配列の宣言 '▼初期値を指定(この場合Dub_Arrays(1,2)で初期値つきの宣言となる) Dim Dub_Arrays(,) As Double = {{ 2.5, 1.3, 6.4 }, { 3.3, 2.9, 7.6 }}
配列を宣言する(動的配列・要素数指定なし)
'*** 配列の宣言(動的配列) *** '//1次元配列 Dim Date_Arrays() As Date '//多次元配列 Dim int_Arrays(,,) As Integer '//ジャグ配列・配列の配列・入れ子になった配列 Dim byt_Arrays()() As Byte Private Sub Test1() '*** 配列の再定義・初期化 *** '▼ReDimを使用した再定義::メソッド内で使用します。 ReDim Date_Arrays(3) '要素数を再定義して利用可能にする ReDim Preserve sho_Arrays(20,10,4) '値を保持して要素数を再定義する '▼int_Arrays(,,)の初期化(2007/9/2動作確認)::メソッド内で使用します int_Arrays = New Integer(,,) { _ 'int_Arrays(1,2,2)で初期化 { _ {1,2,3},{4,5,6},{7,8,9} _ },{ _ {10,11,12},{13,14,15},{16,17,18} _ } _ } End Sub
配列で複数の型を使用する(2007/9/2動作確認)
Dim obj_List As Object(,) = New Object(,) { _ { "あさくら みなみ" , True , 7 , #12/24/2000# } _ ,{ "うえすぎ かつや" , False , 8 , #5/6/2000# } _ ,{ "うえすぎ たつや" , False , 8 , #5/5/2000# } _ } 'Dim obj_List(,) As Object = New Object(,) { _ ' { … },{ … },{ … }, … _ '} <============================== の書式でも可(確認済み) Private Sub Test2() Dim Name As String '氏名 Dim GirlOrBoy As String '性別 Dim Age As Integer '年齢 Dim Birthday As Date '誕生日 Name = obj_List(1,0) 'うえすぎ かつや If CBool(obj_List(1,1)) = True Then '男の子 GirlOrBoy = "女の子" Else GirlOrBoy = "男の子" EndIf Age = CInt(obj_List(1,2)) '8(歳) Birthday = CDate(obj_List(1,3)) '2000/5/6 End Sub※Object型からString型変換 CStr(expression) とすると、ここでの期待値を返さないようなので注意(動作未確認)
(^.^)ふと疑問!ふたごの場合最初に生まれたのが”弟”あとで生まれたのが”兄”だったと思う。例えば、「たっちゃん」が 5/5 23:50 に誕生、「かっちゃん」が 5/6 AM1:10 に生まれた場合、どっちが弟?(…どうでもいい話…)
※この生年月日データはテストデータです。名作漫画「タッチ」の登場人物とは一切関係ありませんので予めご了承ください。 … ^^;
▲上へ
構造体の宣言(Structureステートメント)
注)Structureステートメント(構造体)は、メソッド内で宣言できません。
vb構造体、ユーザー定義型、レコード宣言
'構造体を宣言する(学年名簿の構造体) Structure ClassNamesList Dim Number As Integer Dim Name As String Dim Age As Integer End Structure '構造体を適用した変数の定義(グローバル変数とする場合) Dim Year1_Class3 As ClassNamesList '1年3組::名簿構造体の変数定義 Dim Year2_Class3 As ClassNamesList '2年3組::名簿構造体の変数定義 Dim Year1_Class1 , Year1_Class2 As ClassNamesList 'これも可(^。^) Pribate Sub test3() '使用方法(値の代入) Year1_Class3.Number = 10 Year1_Class3.Name = "あさくら みなみ" Year1_Class3.Age = 7 '使用方法(転記する)…転記が楽ちんです!(^o^) Year2_Class3 = Year1_Class3 '2年3組へ転記(代入) End Sub※VB2005(VB.NETから?)では、Typeによる構造体宣言が廃止され、Structureを使用する。
※Opera Mozilla系で、アンダーバー( _ )が見えないところがあります。[css弄りすぎの副作用?]
※注1)構造体の要素が String , Object など参照型では、参照先ポインタのコピーとなる。…>String型は問題なく実体をコピーできる?(みたいな…感じ…)::一括転記…>各変数表示…>転記元へ別データ代入…>各変数再表示…>期待値が表示されるため。::メモ:構造体内に配置した配列,Objectは、また別物(特に配列)と思う。
▲上へ
構造体へ構造体を含める
宣言済み構造体(型)を、別の構造体中の要素へ適用する
'科目(構造体) Structure Subject_Structure Dim Calculation As Integer '算数(計算) Dim JpLanguage As Integer '国語 Dim Science As Integer '理科 End Structure '生徒別の成績(構造体) Structure TestResult_Structure Dim Name As String Dim Result As Subject_Structure '科目の構造体を適用 End Structure Private Sub test4() 'ローカル変数として利用する場合 Dim Test As TestResult_Structure '変数の定義 Test.Name = "うえすぎ かつや" Test.Result.Calculation = 95 Test.Result.JpLanguage = 85 Test.Result.Science = 92 End Sub※問題無いと思うのでノーチェック
▲上へ
構造体と配列
構造体へ配列を含める(動作未チェック::これで動く?といった覚え書き程度)
Structure TestResult_Structure Dim Name As String Dim Result() As Integer '試験の得点 算数 国語 理科 End Structure Private Sub test5() 'これは問題なく利用可能 Dim Tests as TestResult_Structure '構造体変数を宣言 ReDim Tests.Result(2) '3教科成績の配列を再定義 'ReDimを使用しないで、「Tests.Result = New Integer(2) {}」 でも可。 Tests.Name = "うえすぎ たつや" Tests.Result(0) = 65 '算数の得点 Tests.Result(1) = 70 '国語の得点 Tests.Result(2) = 82 '理科の得点 End Sub Private Sub test6() 'これが、問題 … (ーー;) Dim Tests(50) as TestResult_Structure '51人分の配列を宣言 ReDim Tests(39).Result(2) '40人分3教科成績の配列を再定義 Tests(12).Name = "うえすぎ たつや" Tests(12).Result(0) = 65 '算数の得点 Tests(12).Result(1) = 70 '国語の得点 Tests(12).Result(2) = 82 '理科の得点 End Sub※ReDim はグローバル変数として再定義できないので注意。
▲上へ
Withブロックを使った構造体名称の短縮
With 〜 End With の使用
'構造体の定義 Structure ClassList_Structure Dim AttendanceNumber As Integer Dim StudentName As String End Structure 'Withブロックの使用 Private Sub test6() Dim meibo As ClassList_Structure With meibo .AttendanceNumber = 14 .StudentName = "うえすぎ たつや" End With End Sub※構造体使用時に長くなりがちな名称や、繰返す記述を短縮できる。
▲上へ
構造体中へ値(初期値)を定義する
構造体メンバに Shared を指定して定義すると初期値を設定できます。但し、その型で定義したすべての構造体変数で同一の共有変数となることに注意。
※誤って変更すると、この型で宣言した他の構造体変数値も変わります。
Structure Pr_Strct Shared x As Single = 0.1 Shared y As Single = 0.2 Dim a As Single End Structure Private Sub SubPermission() Dim pr As Pr_Strct Dim pp As Pr_Strct pr.a = pr_Strct.x + Pr_Strct.y MsgBox("pr.a = " & pr.a) 'pr.a = 0.3 が表示される。 End Sub※pr.x, pr.y, pp.x, pp.y でも実行エラーにならないが、正しくは[構造体名称].[メンバ名]-> pr_Struct.x pr_Struct.y と記述して使用する。(…ようだ…)
※注:pr.x pp.x 、pr.y pp.y は同じ入物(メモリ)となるので注意。
※この構造体定義で値を代入しておけば、後で説明する列挙体「抵抗のカラーコード」の小数点付きも処理可能。
※Shared 以外に1つ以上の Dim メンバなどを定義しないとエラーがでます。
▲上へ
定数の宣言
定数を定義する
定数を定義します … とって付けた感じですが …
Const MAX_COUNT As Integer = 100 Const COMPANY_NAME As String = "○△□株式会社"※2007.8.31イコール(=)の抜けを修正
▲上へ
列挙体(Enum ステートメント)
関連性がある複数の値をまとめて定数として定義する場合に便利な定義体です。■列挙体の定義
'◇1:抵抗のカラーコード(第一数字・第二数字の列挙体) Enum ColorCodeResistance Black '黒=0 Brown '茶=1 Red '赤=2 orange '橙=3 Yellow '黄=4 Green '緑=5 Blue '青=6 Purple '紫=7 Gray '灰=8 White '白=9 End Enum '※値を指定しない場合 0 から順に値を割り振る。 '◇2:抵抗のカラーコード(第三数字(乗数)) Enum ColorCodeMultiplier As Long Black = 10 ^ 0 '黒=10^0 1 Brown = 10 ^ 1 '茶=10^1 10 Red = 10 ^ 2 '赤=10^2 100 Orange = 10 ^ 3 '橙=10^3 1,000 Yellow = 10 ^ 4 '黄=10^4 10,000 Green = 10 ^ 5 '緑=10^5 100,000 Blue = 10 ^ 6 '青=10^6 1,000,000 Purple = 10 ^ 7 '紫=10^7 10,000,000 Gray = 10 ^ 8 '灰=10^8 100,000,000 White = 10 ^ 9 '白=10^9 1,000,000,000 Silver = 10 ^ -1 '銀=10^-1 0.1 <- (X) Gold = 10 ^ -2 '金=10^-2 0.01 <- (X) End Enum '※値を直接代入する。(上記のように 10^6 などのような値の代入も可。) '代入値は符号付整数のみ。 'ここではGray,Whiteなど桁数が大きいのでLong指定。 'Silver,Goldが整数でない。これは正常処理不可のため要工夫。 '(小数点以下切捨) '◇3:抵抗のカラーコード(抵抗値許容差) Enum LimitDeviationTolerance 'Black Brown = 1 '茶:Brown ± 1% Red = 2 '赤:Red ± 2% 'Orange 'Yellow Green = 0.5 '緑:Green ± 0.5% <- (X) Blue = 0.25 '青:Blue ± 0.25% <- (X) Purple = 0.1 '紫:Purple ± 0.1% <- (X) 'Gray 'White Silver = 10 '銀:Silver ± 10% Gold = 5 '金:Gold ± 5% Plain = 20 '無:Plain ± 20% End Enum '※値を代入する。(小数点以下の指定不可。文字列の代入不可:確認済み) 'Green,Blue,Purpleが整数でないため正常処理不能。 '代入値は符号付整数まで。 '指定可能型:Byte,Integer,Long,SByte,Short,UInteger,ULong,UShort '指定例は◇2:参照。
■列挙体の使い方
構造体と似た変数宣言ができる?(意味不明ですが・・・)
実際は、[列挙体名(enumeration name)].[定数メンバ(member name)]として利用する。
※列挙体定義で小数点付きの値を代入してもエラーは出さないが、実際に使用すると小数点以下切捨てされるようなので注意。(上記のままでは利用不可ということです。)
'Dim clNo As ColorCodeResistance 'Dim multi As ColorCodeMultiplier 'Dim margin As LimitDeviationTolerance Dim resistanceValue As Long '抵抗値 Dim resistanceMargin As String '誤差の範囲(文字列として表示) '第一数字:青 第二数字:赤 第三数字:橙 第四数字:無色(色なし) resistanceValue = _ ( ColorCodeResistance.Blue * 10 + ColorCodeResistance.Red ) _ * ColorCodeMultiplier.Orange resistanceMargin = "±" & LimitDeviationTolerance.Plain & "%"
※使用例の解説
抵抗器の抵抗値は、( 6[青] * 10[位] + 2[赤] ) * 1,000[橙] なので、62KΩ
抵抗値の誤差範囲は、無色[色なし]で 20 なので、±20% が取得できます。
■列挙体の利用シーン
- Webセーフカラー
- Black=&h000&, Navy=&h008&, Blue=&h00f&, Teal=&h088&, Green=&h080&, Lime=&h0f0&, Aqua=&h0ff&, Maroon=&h800&, Purple=&h808&, Olive=&h880&, Gray=&h888&, Silver=&hbbb&, Red=&hf00&, Fuchsia=&hf0f&, Yellow=&hff0&, White=&hfff&
- 曜日の定義
- Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
- 月の定義
- January, February, March, April, May, June, July, August, September, October, November, December
- 月別日数定義
- m1=31, m2=28, m3=31, m4=30, m5=31, m6=30, m7=31, m8=31, m9=30, m10=31, m11=30, m12=31
(閏年の2月は29日で例外。別途処理必要)
■列挙体の使用例2
'◇パーミッション Enum Permission n '0:000:なにも許可しない x '1:001:実行(eXecute) w '2:010:書き込み(write) _wx '3:011:※この指定は通常ない r '4:100:読み込み(read) r_x '5:101:読込、実行許可 rw_ '6:110:読込、書込許可 rwx '7:111:読込、書込、実行許可 End Enum Private Sub setPermission() Dim pm As Permission 'pm = r_x 「読込、実行許可」を設定 pm = Permission.r Or Permission.x End Sub※列挙体をフラグフィールドとして利用した例。
※列挙体では、With 〜 End With の利用は出来ません。(型名なので…)
▲上へ
VB2005関連リンク
VisualBasic2005の本
入門向け
入門以上
専門向け(理系・DB・その他)
wiki内関連ページ
外部リンク
ありません▲上へ
2007年10月27日(土) 09:33:21 Modified by cafeboy1