Skip to main content

2 posts tagged with "VBA"

View All Tags

Excel VBA: 指定した行、列内のテーブルのセルに乱数を格納

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

excel_vba_random_cells 今回のネタは乱数でサンプルデータを生成したいときなどに使えますかね。

ソースコード

Sub randloop()
Randomize ' シードの設定(引数省略でシステムタイマーの値)
Const GYO_S As Integer = 1 ' 開始行
Const RETSU_S As Integer = 1 ' 開始列
Const GYO_E As Integer = 10 ' 終了行
Const RETSU_E As Integer = 5 ' 終了列
Const UPPER As Integer = 100 ' 乱数の最大値
Const LOWER As Integer = 0 ' 乱数の最小値
' 指定された行、列のテーブル内のセルに乱数を格納
For i = GYO_S To GYO_E
For j = RETSU_S To RETSU_E
' Rndは[0, 1)の範囲の値を返す
Cells(i, j).Value = Int((UPPER - LOWER + 1) * Rnd + LOWER)
Next j
Next i
End Sub

実行結果は上図のように0~100の範囲の乱数(今回は整数)が格納されます。 上記のコードの要の式は

(upper - lower + 1) * Rnd + lower

です。簡単に意味を説明しますと括弧内の+1はRndの戻り値の範囲が1未満の為の補正で、式の最後の+lowerはRndの戻りが0の場合の補正、と捉えます。

参考サイト

  • VBA World : 乱数の発生(関数:Rnd) その1

Excel VBA: Hello Worldと変数、配列の宣言

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ポツポツ使う場面が増えてきたので、備忘録代わりにまとめていこうかな(気が向いたときに)。

VBAでHello World

メニューバーからツール→マクロ→Visual Basic Editor(Alt+F11)をクリックするとエディタが起動します。最初は何もファイルが開かれていないと思うので、まず、メニューバーから挿入→標準モジュールをクリックして新規作成し、試しに以下のコードを打ち込んで実行してみます。

Sub helloWorld()
MsgBox "Hello, VBA"
End Sub

入力し終わったらメニューの実行→Sub/ユーザー フォームの実行(F5)をクリックするとスクリプトが実行されます。結果は下図のようになります。 vba_hello_world ダイアログボックス内に文字列が表示されていますね。仮に下記のようにした場合は、

Sub helloWorld()
MsgBox "Hello, VBA"
MsgBox "Hello, Excel"
End Sub

一つ目の"Hello, VBA"のダイアログのOKを押した後、"Hello, Excel"のダイアログが表示されます。どうやらMsgBox関数はブロック関数みたい。

変数の宣言 - Dim

Sub varTest()
Dim num1 As Integer
Dim str1 As String
Dim num2 As Integer, str2 As String
num1 = 10
str1 = "文字列1"
MsgBox num1 & " " & str1
MsgBox num2 & " " & str2, vbInformation, "デバッグプリント"
End Sub

実行結果は vba_var01 vba_var02 変数宣言の一般式は

Dim <変数名> As <型>

のようにDim~Asステートメントを用います。 また、MsgBox関数のvbinformationを指定することで情報メッセージアイコンを表示します。ちなみに、出力する複数の文字列の連結は「&」を用います。

定数の宣言 - Const

Const <定数名> As <型> = <値>

変数宣言と似てますね。異なるところは、DimがConstに変わり、宣言と値の初期化を同時に行うことですかね。変数も値の初期化は可能ですが、それは任意です。

オブジェクトの参照を変数に格納 - Set

オブジェクトの参照を代入する際にはSetステートメントを使用します。以下のコードは1つ目のワークシート名を表示しています。

Sub objectTest()
Dim tmpSheet As Worksheet
Set tmpSheet = Worksheets(1)
MsgBox tmpSheet.Name, vbInformation
End Sub

実行結果は vba_var_set01 一般式は

Set <オブジェクト型変数> = <オブジェクト>

コンパイルエラー、「SubまたはFunctionが定義されていません」の原因

大抵ミスタイプです。Worksheets(1)と打つところをWorksheet(1)としてしまうとか。変数宣言のミスでもデフォルトでは「SubまたはFunctionが~」と出力されるので注意。

配列の宣言

Dim <配列名>(<要素数>) As <型>

Sub objectTest()
Dim arr(3) As Integer
arr(0) = 99
MsgBox arr(0)
End Sub

ダイアログには99が表示されます。配列の添え字は0から数えますが、下記の文をモジュールの宣言セクションに書くことで1から数えられます。

Option Base 1

Option Base 1
Sub objectTest()
Dim arr(3) As Integer
arr(1) = 99
MsgBox arr(1)
End Sub

実行結果は同じく99です。