2. 具体的には
・シート output をつくり
ユーザーが変更するようなことはこのシートに列挙しておく
・マクロの先頭で、シート input に書かれた値を読み込み、変数に代入して使う
変数の命名ルール(マクロを作る前に決めておく)
定数…大文字で始める
変数…小文字で始める
※予約語(マクロの命令、オブジェクト名、等と同じ単語)は使えない。
'============================================================
マクロ文の実例
MsgBoxで指示を受け取ることもできる
MsgBox("消してもいいですか", vbOKCancel)
' 1 vbOK
' 2 vbCancel
MsgBox("三択で指示してください", vbYesNoCancel)
' 6 vbYes
' 7 vbNo
' 2 vbCancel
with オブジェクト~end with の間は、オブジェクトの記述を省略できる
=マクロ文の記述が楽になる
(オブジェクトの表示文字数が長い場合は)マクロを読み易くなる
ActiveSheet.Range("A:A").Copy ・・・ コピー
ActiveSheet.Range("C:C").Insert ・・・ 挿入
ActiveSheet.Range("C:C").PasteSpecial ・・・ 形式を選択して貼り付け
'============================================================
作成したマクロ
'------------------------------------------------------------
Option Explicit
Public Sub MyMsg01()
'メッセージボックスに表示する
'comment
MsgBox "Hello VBA!"
End Sub
'------------------------------------------------------------
Public Sub MyConsole01()
'イミディエイトウィンドウに表示する
Debug.Print "Hello VBA console!"
End Sub
'------------------------------------------------------------
Public Sub MyInpurt()
Dim name1 As String
name1 = InputBox("may I know name?")
Debug.Print name1
MsgBox name1
End Sub
'------------------------------------------------------------
Private Sub MyNumber01()
Dim num1 As Long
' 数値型に文字列は代入できない
' num1 = "100"
num1 = 100
Debug.Print num1
Dim str1 As String
str1 = "100"
3. Debug.Print num1 + str1
' 200 が表示される
Debug.Print num1 & str1
' 100 100 と表示される
Debug.Print str1 + num1
' 200 が表示される
'Debug.Print "test: " + str1 + num1
' エラー 型が一致しない
Debug.Print "test: " & str1 + num1
' test: 200 が表示される
Debug.Print "test: " & str1 & num1
' test: 100100 が表示される
' 数値と文字をつなげて表示させるときは & でつなぐ
End Sub
'------------------------------------------------------------
Public Sub MyWrite01()
' セルに値を書き込む
ActiveSheet.Range("a1").value = "A1に書き込む"
' inputbox に入れた値を直接セルに書く
ActiveSheet.Range("a1").value = InputBox("please input value 1st?")
' 行を折り返す時は _ を使う
ActiveSheet.Range("a1").value = _
InputBox("please input value 2nd?")
' 作法にそって値の型を宣言すること
Dim val As String
val = InputBox("please input value 3rd?")
ActiveSheet.Range("a1").value = val
' range に複数セルを指定すると
Dim val As String
val = InputBox("please input value 4th?")
ActiveSheet.Range("a1:c9").value = val
End Sub
'------------------------------------------------------------
Public Sub MyWrite02()
' セルに値を書き込む
Dim val As String
val = InputBox("please input value")
ActiveSheet.Cells(1, 2).value = val
End Sub
'------------------------------------------------------------
Public Sub MyClear01()
' range指定で消す
' ActiveSheet.Range("A1:C9").Clear
' ActiveSheetだと大切なデータを消してしまうのでシートを指定する
'Sheets("Sheet1").Range("A1:C9").Clear
Dim confirm As Integer
confirm = MsgBox("消してもいいですか", vbOKCancel)
' 1 vbOK
' 2 vbCancel
If confirm = vbOK Then
Sheets("Sheet1").Range("A1:C9").Clear
Else
MsgBox "キャンセルされました"
4. End If
End Sub
'------------------------------------------------------------
Private Sub myIf01()
Dim confirm As Integer
confirm = MsgBox("三択で答えてもらう場合", vbYesNoCancel, "3つめの引数でMsgBoxのタイトルを指定
できる")
' 2 vbCancel
' 7 vbNo
' 6 vbYes
' 戻り値を知らなくても、定数の名前を知っておけばよい
If confirm = vbYes Then
Debug.Print "vbYes vbYes"
ElseIf confirm = vbNo Then
Debug.Print "vbNo vbNo"
ElseIf confirm = vbCancel Then
Debug.Print "vbCancel vbCancel"
End If
End Sub
'------------------------------------------------------------
Public Sub MyRead01()
' セルから値を読み込む
' 定数は最初に宣言し、値を決めておく
' InputSn : inputシート名
Const InputSn As String = "input"
Const MyNameRange As String = "B1"
Dim name As String
'name = Sheets("input").Range("B1").Value
' 定数は最初に宣言すると…
name = Sheets(InputSn).Range(MyNameRange).value
Debug.Print name
End Sub
'------------------------------------------------------------
Public Sub MyFor01()
' For文で0から10までカウントアップ
Dim ProcStart As Long
ProcStart = 0
Dim ProcEnd As Long
ProcEnd = 10
Dim i As Integer
'For i = 0 To 10 Step 1
'変数を使ってみる…
For i = ProcStart To ProcEnd Step 1
Debug.Print i
Next
End Sub
'------------------------------------------------------------
Public Sub MyProg()
' シートouputの列名の開始行から終了行までを値で埋める
Const OutputSn As String = "output"
Const InputSn As String = "input"
Const ProcCol As String = "B2"
Dim vProcCol As String
Const ProcStart As String = "B3"
Dim vProcStart As Long
Const ProcEnd As String = "B4"
Dim vProcEnd As Long
Const Procvalue As String = "B5"
Dim vProcvalue As String
Dim i As Integer
5. ' 設定値を読み込む
vProcCol = Sheets(InputSn).Range(ProcCol).value
vProcStart = Sheets(InputSn).Range(ProcStart).value
vProcEnd = Sheets(InputSn).Range(ProcEnd).value
vProcvalue = Sheets(InputSn).Range(Procvalue).value
' with を使うと記述が楽になる
' With Sheets(InputSn)
' vProcCol = Range(ProcCol).value
' vProcStart = Range(ProcStart).value
' vProcEnd = Range(ProcEnd).value
' vProcvalue = Range(Procvalue).value
' End With
' 三択で指示を受ける
Dim confirm As Integer
confirm = MsgBox("Range指定で一気に埋める…Y for文で一つずつ埋める…N 消す…キャンセル",
vbYesNoCancel)
If confirm = vbYes Then
' rangeで指定して一気に埋める
Sheets(OutputSn).Range(vProcCol & vProcStart & ":" & vProcCol & vProcEnd).value =
vProcvalue
ElseIf confirm = vbNo Then
'for文で一つずつ埋める
For i = vProcStart To vProcEnd Step 1
Sheets(OutputSn).Range(vProcCol & i).value = vProcvalue & vProcvalue
Next
ElseIf confirm = vbCancel Then
Sheets(OutputSn).Range(vProcCol & vProcStart & ":" & vProcCol & vProcEnd).Clear
End If
End Sub
'------------------------------------------------------------
Public Sub MyInsert01()
Const OutputSn As String = "output"
Const InputSn As String = "input"
Const ProcSrc As String = "B7"
Dim vProcSrc As Long
Const ProcDst As String = "B8"
Dim vProcDst As Long
Const ProcCount As String = "B9"
Dim vProcCount As Long
Dim i As Integer
' 設定値を読み込む
vProcSrc = Sheets(InputSn).Range(ProcSrc).value
vProcDst = Sheets(InputSn).Range(ProcDst).value
vProcCount = Sheets(InputSn).Range(ProcCount).value
' 設定値をwithで読み込むと値が全てゼロになる=読み込めない?
' With Sheets(InputSn)
' vProcSrc = Range(ProcSrc).value
' vProcDst = Range(ProcDst).value
' vProcCount = Range(ProcCount).value
' End With
Debug.Print vProcSrc
Debug.Print vProcDst
Debug.Print vProcCount
' 設定値をwithで読み込むと値が全てゼロになる=読み込めない?
With Sheets(OutputSn)
For i = 1 To vProcCount
Range(vProcSrc & ":" & vProcSrc).Copy
Range(vProcDst & ":" & vProcDst).Insert
' Range(vProcDst & ":" & vProcDst).PasteSpecial 'ペースト
Next
End With
End Sub