エクセルの マクロ 言 語 (VBA)に 慣 れるためのメモ 2014/1/31~ ~2015/12/31 作 成 : 縁 木 精 史
エクセル マクロ 言 語 とは エクセルのマクロとは 手 番 をあらかじめ 記 述 しておくことにより 通 常 手 操 作 している 処 理 を 自 動 化 すること 自 動 化 したものです マクロで 手 番 を 記 録 すれば 繰 り 返 し 作 業 を 自 動 化 できます また 連 続 的 な 集 計 作 業 の フローを 明 示 化 でき 作 業 条 件 が 変 わらなければ マクロはそのまま 継 続 使 用 できます マクロは コードを 直 接 入 力 する 方 法 と 操 作 が 自 動 的 にコード 変 換 されたキー 記 録 の2つの 方 法 があります 簡 単 なコードは 覚 えましょう 複 雑 なコードになるばあいはキー 記 録 で 作 成 されるコードを 利 用 しましょう ただ キー 記 録 で 作 成 されるコードの 意 味 がほぼ 分 かる 程 度 までは コード 言 語 レベルの 知 識 を 持 つことが 大 切 かと 思 います マクロ 言 語 とは? http://excelvba.pc-users.net/index.html http://www.eurus.dti.ne.jp/~yoneyama/excel/exl-_zen.htm#vba_jitu http://excelvba.pc-users.net/ VBA 画 面 の 説 明 http://www.eurus.dti.ne.jp/~yoneyama/excel/vba/vba_vbe.html ExcelVBAの 使 い 方 http://homepage2.nifty.com/nandemoarchive/cyou_nyumon/excel_01.htm
VBA for Excelの 特 徴 ( 他 のスクリフ ト 言 語 に 比 べ) コード( 構 文 )の 次 群 が 自 動 表 示 され また 実 行 エラー 箇 所 を 示 してくれます ネット 上 に 山 と 言 うほどの 説 明 があるし 回 答 者 が 多 くいます 注 1) 英 語 語 句 の 読 み 方 は http://vbae.odyssey-com.co.jp/study/glossary.html を 参 照 注 2)マクロとは プログラミング 言 語 その 一 つに Visual Basic for Applications ( 略 してVBA)があり EXCEL 用 のVBA WORD 用 のVBA powerpoint 用 のVBAがあります 注 3)まずは VBAが 何 であるかを 理 解 する 前 に 実 際 に 作 成 し 実 行 し その 結 果 を 見 て 経 験 する 馴 染 む 慣 れる ことが 理 解 への 近 道 注 4) 変 数 とは? マクロ 内 で 使 用 する セル みたいなものです ただ セルのように 何 でも 入 るわけではありません 入 れるものが 数 値 文 字 範 囲 シート 名 などであれば それぞれに 変 数 の 定 義 をする 必 要 があります 変 数 は 値 の 入 れ 物 ですが その 処 理 やブックを 終 了 すると 消 えます 定 義 dim i as long iを 数 値 型 (long)として 定 義 します 文 字 を 入 れるなら dim i as string とします ただ 慣 習 があり I,j,kなどは 数 値 を 入 れる 変 数 とされています ちょっと 不 便 なセルが 変 数 ということでしょうか? 成 り 立 ちとしては 変 数 から セルが 考 えられたのでしょうけど [ 参 考 ] わずかな 知 識 でVBA! http://koikide.net/hensuu.html
マクロ 言 語 の 基 本 文 1セル シート ブックの 表 現 A1と 言 っても 同 じ 画 面 を 見 ている 人 同 士 は それで 通 じるが コードを 記 述 する 場 合 は そ セルA1 range( a1 ) range: 読 み 方 :レンジ のような 前 提 は 通 じないので どのブックの シート1 sheets("sheet1") どのシートの A1かを 指 定 しないといけない abcブック workbooks("abc.xlsx") マクロが 保 存 されているブック Thisworkbook アクティブになっているブック Activeworkbook : キーボード マウスが 対 象 とするブック 2セルに 値 を 代 入 する ( 右 から 左 に 代 入 ) セルA1に10を 代 入 する range("a1")=10 sheet2のシートのb1に 住 所 を 代 入 する sheets( sheet2 ).range( b1 )= 住 所 マクロでは シートを 切 り 替 える 必 要 はない セルA1の 値 をセルA10に 代 入 する range( a10 )=range( a1 ) 又 は range("a10")=range("a1").value セルA1にSUM 関 数 を 代 入 する range("a1")="=sum(b1:b10)" セルA1からセルA100を 選 択 する range( a1:a100 ).select セルA1からA100までのすべてのセルに 5を 入 力 する Range("a1:a100") = 5 もし abc.xlsxのシート1がアクティブで セルA1に100を 代 入 するなら range("a1")=100 で 良 いが sheet2がアクティブである 場 合 に sheet1のa1に100を 入 れるなら sheets( sheet1 ).range( a1 )=100 とします 2つのブックをオープンしている 場 合 なら workbooks("abc.xlsx").sheets("sheet1").range("a1")=100 としないと どのブックに 代 入 するのか 不 明 確 となり 意 に 反 する 動 きとなります シートやブックを 明 示 的 に 指 定 しない 場 合 予 期 せ ぬ 処 理 結 果 がシートに 出 力 される 可 能 性 があるの で 注 意 すること!
マクロ 言 語 の 基 本 文 3 変 数 を 使 う( 処 理 上 仮 に 値 を 入 れるもの) まず 使 うだろう 変 数 を 定 義 します dim i as long 変 数 iは 慣 習 longは 数 値 型 文 字 を 入 れる 変 数 なら stringとします i=range( a1 ) A1の 値 は 数 値 であること でないと エラーとなります range("b1")=i range("b2")=i 4コピー&ペースト range( a1:a100 ).copy range( h2 ) a1からa100のセル 範 囲 をコピーし h2に 張 り 付 けます dim 範 囲 as range セル 範 囲 として 範 囲 と 言 う 語 を 変 数 定 義 set 範 囲 =range( a1:a1000 ) セル 範 囲 を 範 囲 に 代 入 する (range 型 のみsetを 使 う )) 範 囲.copy range( h1 ) 範 囲 をコピーして H1セルに 貼 り 付 けます
基 本 処 理 (1) 繰 り 返 し 処 理 1for~next セルA1からA100までに 1,2,3と 連 番 を 入 力 する 場 合 dim i as long for i=1 to 100 range("a" & i)=i next nextは next i と 変 数 を 付 けてもOKです for~nextのなかに for~nextがあるような 入 れ 子 構 造 をネストすると 言 うそうですが そのような 場 合 nextがどの 変 数 のものかなどを 明 示 するために nextの 後 ろに 変 数 を 付 けたほうが 良 いと 思 われますが そもそも 的 にはネストした 構 文 は 使 わないことを お 勧 めします セルA10から 上 方 向 に 10をカウントダウンした 数 値 を 代 入 します dim i as long for i=10 to 1 step -1 range("a" & i)=10-i next 2do While ~ loop while: : 読 み 方 :ホワイル セルのA1~A10に1~10を 入 力 する 場 合 i = 1 Do While i < 11 Worksheets("Sheet1").range("a" & i).value = i i = i + 1 for~nextの 場 合 は 自 動 で 変 数 iはカウントアッフ しますが do~loopの 場 合 はしません Loop
基 本 処 理 (2) 条 件 文 if~end if 条 件 文 1A1セルが10だったら A1セル 値 を2 倍 にした 数 値 をB1セルに 代 入 する 場 合 if range("a1")=10 then range("b1")=range("a1")*2 2A1セルが5だったら B1セルにA1セル 値 を 代 入 する 場 合 if range("a1")=5 then range("b1")=range("a1").value end if 3A1セルが5 以 上 だったら A1セルに10を 加 算 した 値 をB1セルに 代 入 し そうでなかったら A1セルに10をマイナスした 値 をB1セルに 代 入 する 場 合 if range("a1")>=5 then range("b1")=range("a1")+10 Else range("b1")=range("a1")-10 end if
基 本 処 理 (3)for~nextの 繰 り 返 し 文 とif 文 を 組 み 合 わせる 1A1から からA100で 値 が だったら B 列 に を 代 入 する dim i as long for i=1 to 100 if range("a" & i)=" " then range("b" & i)=" " next 2A1から からA100で で A 列 が で かつB 列 が だったら C 列 に を 代 入 する dim i as long for i=1 to 100 if range("a" & i)=" " and range("b" & i)=" " then range("c" & i)=" " next (4)マクロ 言 語 の 中 でワークシート 関 数 を 使 うには セルA6からa4400,000までの 可 視 セル(フィルター 実 行 した 結 果 )の 数 をカウントし A1セルに 代 入 する range("a1") = Application.WorksheetFunction.Subtotal(3, Range("a6:a400000")) もし A1セルに 関 数 式 を 代 入 するなら Range("a1") = "=Subtotal(3, a6:a400000)" とする たとえば マクロからシートに 関 数 式 を 代 入 し その 結 果 をまたマクロで 利 用 することも 可 能 B1セルに A1セル 値 を 参 照 するvlookup 関 数 があったとして range("a1")=10 msgbox range("b1") この 場 合 のiには vlookup 関 数 の 結 果 の 値 が 入 る 計 算 が 複 雑 であれば 結 果 が 出 る 時 間 とマクロが 動 作 する 時 間 差 が 生 まれて 変 数 iに 何 も 入 らないかもしれないが 30 万 件 のvlookupでも 一 瞬 に 計 算 される おそらく 通 常 のオフィスでの 計 算 では 時 間 が 掛 かり 過 ぎるという 計 算 はないと 思 われる あるとすれば 計 算 ではなく シート 選 択 やシート 上 の 値 の 分 類 フィルター ピボットや ブック 選 択 などの 処 理 だと 思 われます
基 本 処 理 (5)キー 記 録 を 参 考 にしてコードを 作 る (キー 記 録 のアレンジ) 例 : L6~L13を 選 択 し コピーし N6をクリックし 行 列 を 入 れ 替 えて 貼 り 付 ける 処 理 を キー 記 録 したら Range("L6:L13").Select Selection.Copy Range("N6").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Range("L6").Select Application.CutCopyMode = False 操 作 を 忠 実 に 記 録 しているが 無 駄 も 多 い マクロ 言 語 では いちいちセルをクリックする 必 要 がないので Range("L6:L13").copy でコピーが 完 了 する copyの 次 にセルを 指 定 すると 貼 付 となるので Range("L6:L13").copy Range("N6").PasteSpecial Paste:=xlPasteAll, Transpose:=True Range("l6").Select Application.CutCopyMode = False とすることができる
基 本 処 理 (6)データの 最 終 行 を 知 る マクロでデータを 集 計 する 場 合 に どの 行 に 対 して 行 うのかを 知 る 必 要 が 出 てきます お 約 束 のコードは [ 参 考 ] http://officetanaka.net/excel/vba/tips/tips130.htm Cells(Rows.Count, 1).End(xlUp).Select cells: 読 み 方 :セルズ 意 味 :A 列 のシート 最 終 行 からCTRL+ キーで 最 初 に 値 が 見 つかったセルを 選 択 する A 列 の 最 終 行 番 号 なら Cells(Rows.Count, 1).End(xlUp).row cells( 行 列 )の 表 記 となり range( 列 行 )とは 反 対 となる range( 列 行 )は A1,B1と 分 かり 易 いが cells( 行 列 )となっているが 列 についても 変 数 が 使 える 利 点 があります cells(1,1)は range("a1")と 同 じ Cells(Rows.Count, 1).End(xlUp).row +1 とすれば A 列 の 最 終 行 の 次 の 行 となり 追 加 すべき 行 となる
基 本 処 理 (7)ファイル 選 択 画 面 を 表 示 し 選 択 したエクセルブックを 開 く 1 [ 参 考 ]http://officetanaka.net/other/extra/tips15.htm Sub Book_open() Dim Atai As Variant, afile As Variant, ws As Variant, wb As Variant, flag As Variant Dim F_name As String Dim i As Long, j As Long Atai = MsgBox("ブックを 開 く" & vbcrlf & _ "オープンするブックを 選 択 して 下 さい ", vbokcancel, "ブックの 選 択 ") If Atai = vbcancel Then Exit Sub ' ファイルを 取 得 する 為 に 指 定 した 拡 張 子 のみ 表 示 したエクスプローラを 起 動 する afile = Application.GetOpenFilename("xlsファイル (*.xls?),*.xls?",, "ブックを 選 択 して 下 さい", "OK", False) If afile <> False Then j = Len(aFile) For i = j - 1 To 1 Step -1 ' 左 から 最 初 に 見 つかる で 文 字 列 を 区 切 る If Mid(aFile, i, 1) = " " Then F_name = Mid(aFile, i + 1, j) 'ブック Exit For End If Next Else Exit Sub End If ' 選 択 したxlsのパスとファイル 名 を 変 数 に 代 入 ' MsgBox afile ' パス 付 ファイル 名 ' MsgBox Mid(aFile, 1, i) 'パス 名 ' MsgBox F_name 'ファイル 名 ' 同 名 のブックがあれば flag=trueとする 既 に 開 いているなら 処 理 中 止 する For Each wb In Workbooks If wb.name = F_name Then flag = True Exit For End If Next wb If flag = True Then Atai = MsgBox(F_name & "は 開 いています" & vbcrlf & " 処 理 を 開 始 する 前 に 閉 じてください " & vbcrlf & _ "オープンしているブックをアクティブにするなら OKをクリックしてください ", vbokcancel) If Atai = vbcancel Then Exit Sub Workbooks(F_name).Activate Exit Sub End If Workbooks.Open Filename:=aFile End Sub
基 本 処 理 (7)ファイル 選 択 画 面 を 表 示 し 選 択 したエクセルブックを 開 く 2 [ 参 考 ]http://officetanaka.net/other/extra/tips15.htm Sub ブック 選 択 open() 'ブックを 複 数 選 択 して オープンする ' 既 にopenしている 場 合 は openしない Dim OpenFileName As Variant, Target, Wb As Variant Dim I As Long, j As Long Dim Filename Application.ScreenUpdating = False OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", MultiSelect:=True) i = 5 If IsArray(OpenFileName) Then For Each Target In OpenFileName j = 0 For Each Wb In Workbooks If Wb.Name = Dir(Target) Then j = 1 MsgBox " 既 に" & Wb.Name & " はopenしています " End If Next If j = 0 Then Workbooks.Open Target i = i + 1 Next Target Else ' MsgBox "ブック 選 択 は キャンセルされました" End If ThisWorkbook.Activate: Sheets("ブック 一 覧 ").Activate End Sub
基 本 処 理 (8) 図 形 (ボタン)とマクロ(モジュール)との 関 連 付 け ボタンは 図 形 から 選 んで シート 上 に 作 成 します ボタンを 右 クリックして マクロの 登 録 を 選 択 既 に モジュールを 作 成 していれば モジュール 名 =マクロ 名 が 表 示 されているので それを 選 択 して OKボタンクリックで 関 連 付 け 完 了 となります これで ボタンをクリックすると マクロが 実 行 されます この 関 連 付 けは オブジェクトであればできるので テキストボックスにも グラフにもマクロとの 関 連 付 けを 行 えます コントロールのコマンドボタンを 使 っても 当 然 に 関 連 付 けることが できます フォームのコマンドボタンだと サイズを 確 定 した 後 に マクロの 登 録 フォームが 開 きます (9) 処 理 途 中 にメッセージを 表 示 させる マクロが 勝 手 に 処 理 を 行 い いつ 終 了 したのかわからないので メッセージを 表 示 させることができます msgbox " 処 理 が 終 了 しました " Atai=msgbox(" 次 の 操 作 に 移 りますか?",vbokcancel,"title") if atai=vbok then msgbox yes selected
業 務 作 業 に 適 用 する (1) 業 務 フローを 想 像 してみる 例 : 各 部 署 に 指 定 のエクセルブック( 書 式 統 一 )を 配 付 回 収 し その 個 々のブックの 集 計 を 半 自 動 化 する 1 前 提 条 件 配 付 のエクセルブックは 以 下 のとおりとする C11~c15までを 回 答 欄 とする シートは1 枚 のみのブックとする シート 名 はsheet1とする C10は 氏 名 とし 氏 名 がない 場 合 は 確 認 後 氏 名 をハンド 入 力 する 2 処 理 イメージ 自 動 で 行 う 事 は ファイルを 手 作 業 で 指 定 し 開 いたら 自 動 で 集 計 ブックに 転 記 し そのブックを 閉 じる 3 作 っていく 新 規 ブックを" 集 計 "の 名 前 で 保 管 集 計 ブックのVBEを 開 いて 挿 入 ~ 標 準 モジュール モジュール 画 面 にコードを 入 力 していく sub マクロ 名 ( 自 由 の 名 前 を)() ' ()はお 約 束 ' 処 理 を 書 いていく が 行 の 先 頭 にある 行 は 注 釈 となり 処 理 では 無 視 される end sub 今 回 は 集 計 というマクロ 名 にする まず 行 いたいことを 注 釈 で 書 く その 注 釈 をコードに 直 していく
業 務 作 業 に 適 用 する (2) 業 務 に 応 用 してみる ~ 注 釈 書 き その 後 コード 化 する 4 処 理 を 注 釈 ( 言 葉 )で 書 いてみる ファイル 選 択 画 面 を 表 示 する (ファイル 選 択 画 面 は 特 定 のフォルダーを 指 定 したい ) ファイル 選 択 画 面 で 対 象 ファイルを 見 つけ 選 択 する 何 も 選 択 しない 場 合 もある 選 択 したファイルを 開 く サーバーからのファイルを 開 くのに 時 間 が 掛 かるかもしれない 貼 付 け 先 の 最 終 行 の 次 行 を 知 る 開 いたブック シートの 対 象 セル 範 囲 をコピーする このブック シートの 最 終 行 の 次 行 に 貼 り 付 ける クリップボードをクリアする 開 いたブックを 閉 じる
業 務 作 業 に 適 用 する 5 実 際 のコード Sub 集 計 () ' 回 答 表 を 選 択 して 開 く Dim Openfilename as string With CreateObject("WScript.Shell").CurrentDirectory = 総 務 部 01_ 作 業 End With '' 貼 付 け 先 の 行 を 調 べる Dim i As Long i = ThisWorkbook.Sheets( sheet1 ).Cells(Rows.Count, 1).End(xlUp).Row + 1 貼 り 付 け 先 はこのマクロがあるブックのシート1のA 列 Openfilename = Application.GetOpenFilename( Microsoft Excelブック,*.xls? ) 開 きたいファイル 名 をフルパスで 取 得 フルパス 付 ファイル 名 = Openfilename If Openfilename <> "False" Then ' 選 択 内 容 が 空 でなかったら Workbooks.Open Openfilename ' 選 択 したファイルを 開 く Else exit sub End If MsgBox dir(openfilename) & を 転 記 します ' 回 答 表 のC11~C15までをコピーし 集 計 ブック(このブック)の5 行 目 から 貼 り 付 けていく '' オープンしたら そのブックがアクティブになっている! ActiveWorkbook.Sheets("sheet1").Range("c11:c15").Copy コピーしたセル 範 囲 を 行 列 入 れ 替 えて このシートの( 最 終 行 +1) 行 に 貼 り 付 ける ThisWorkbook.Sheets("sheet1").Range("a" & i).pastespecial Paste:=xlPasteAll, Transpose:=True コピーモードを 解 除 する Application.CutCopyMode = False ' 貼 付 けが 完 了 したら 回 答 表 は 閉 じる ActiveWorkbook.Close ' 適 時 処 理 が 終 わる 都 度 メッセージを 表 示 する MsgBox " 処 理 が 完 了 しました End sub
機 能 を 追 加 する 集 計 というマクロ(プロシージャ)が 完 成 したら 更 に 使 い 易 くするために 機 能 追 加 を 考 えてみます だた この 段 階 では 機 能 の 為 の 機 能 を 考 えてしまうことがよくあります ハンドで 簡 単 にできるのであれば マクロを 作 成 する 必 要 はありません マクロを 本 当 に 作 成 するべきかどうか 自 問 することが 大 切 かと 思 います [Q.] 1 自 らの 作 業 効 率 と 間 違 い 防 止 の 為 なのか 2 他 の 人 に 使 ってもらう 為 に 作 成 するのか 3マクロの 勉 強 の 為 に 作 成 するのか 充 分 に 検 討 考 えるべき [A.] 1 作 業 効 率 よりも 間 違 い 誤 操 作 の 防 止 に 重 点 をおいて 考 え 作 成 するべきでしょう 2 他 の 人 の 力 量 レベルはそのままか 力 量 レベルを 上 げるのか 2つの 方 法 がある 3あまり 好 ましいとは 言 えない 更 に 欲 しい 機 能 は? 転 記 したファイルは 転 記 済 みとして 記 録 チェックし 2 重 の 転 記 を 防 ぐ
注 釈 の 重 要 性 コードを 書 いて 正 常 に 実 行 すれば 終 わりではありません その 処 理 が 何 をしているのか 同 時 に 決 めた 変 数 が 何 を 表 すのか 条 件 分 岐 はなぜしないといけないのか などなど 出 来 るだけ 詳 細 に 注 釈 を 入 れてください 作 成 中 や 作 成 直 後 は その 処 理 がイメージされているが 時 間 と 共 にその 記 憶 は 薄 れます 1 年 後 に 不 具 合 や 機 能 追 加 機 能 修 正 が 発 生 した 場 合 に 自 ら 作 成 したとはいえ マクロの 処 理 イメージを 忘 れていることが 多 々あります 一 からコードを 読 んで 理 解 する 手 間 を 省 くためにも 自 分 のために 注 釈 を 書 いておきましょう [ 例 ] Sub tesuto1() テストのマクロです セルに 連 続 したデータを 入 力 します 'ただし 5の 倍 数 の 場 合 は 値 を10 倍 します 'セルの 値 を 入 れる 変 数 を 定 義 します Dim i As Long 'セル1 行 から100 行 まで セル 毎 に 判 定 し 結 果 を 代 入 します For i = 1 To 100 'まずiには 1が 代 入 されます 'nextまで 行 ったら iに1が 加 算 されます Range("a" & i) = i ' a mod 5とは aを5で 割 った 時 の 余 りを 求 めます ' 5の 倍 数 とは 5で 割 ると 余 りがないので 余 り=0となります If (i Mod 5) = 0 And i > 1 Then Range("a" & i) = (i) * 10 Else '5の 倍 数 以 外 の 時 は 何 も 行 いません End If Next End Sub 注 釈 は コードの 実 行 とは 関 係 なく コードの 意 味 役 割 など コード 編 集 時 に 役 立 てます 注 釈 は 行 の 先 頭 に を 入 力 します この 以 降 の 行 の 語 句 は 注 釈 と 解 釈 されて 実 行 時 は 無 視 されます 1 行 ごとにつける 必 要 があり ます 注 釈 の 始 まり 注 釈 の 終 わりという 記 号 は あ りません
簡 単 な 練 習 (マクロを 作 ってみましょう ) (1)A1からA20までに 連 番 を 入 力 してみる 開 発 タブ~VisualBasicを 選 択 し 挿 入 ~ 標 準 モジュールを 選 択 白 い 入 力 スペースが 表 示 されるので 下 記 のように 入 力 します sub tesuto1() Dim i as long for i=1 to 20 range( a & i)=i next end sub シートとVisualBasicの 編 集 画 面 (VBE)を 併 置 すると 分 かり 易 い エクセルのシートをアクティブにして VBE 画 面 も 見 えるようにウインドウ 調 整 して ツールバーにある ボタン( 実 行 ボタン)をクリックし シート 上 のA1からA20セルに 1からの 連 番 が 入 力 されたことを 確 認 します このコードをシートを 切 り 替 えて 実 行 してみましょう やはり 同 じ 結 果 になります つまり このコードはアクティブシートに 対 して 行 われるコードです アクティブシートが 予 期 していな いシートであった 場 合 既 に 入 力 されている 値 を 書 き 換 えます マクロでの 変 更 は ctrl+zの 元 に 戻 すが 効 きません
簡 単 な 練 習 (マクロを 作 ってみましょう ) (2) 先 ほどのコードで 対 象 シートをsheet1に 限 定 してみます sub tesuto1() Dim i as long sheets( sheet1 ).activate <----- sheet1シートをアクティブにします for i=1 to 20 range( a & i)=i next end sub (3)アクティブシートに 関 係 なく sheet1シートにマクロが 実 行 するようにします sub tesuto2() Dim i as long sheets( sheet2 ).activate sheet2シートがアクティブになります with sheets( sheet1 ) ですが 連 番 は sheet1に 入 力 されます for i=1 to 20.range( a & i)=i. は sheets( sheet1 ).range( a & i)の 省 略 next end with with~end Withはworkbooks worksheets range などの 省 略 する 場 合 に 使 用 すると 便 利 です end sub
簡 単 な 練 習 (マクロを 作 ってみましょう ) (4) (3)のコードでは 処 理 が 終 了 しても 分 かりません 処 理 が 終 了 したら メッセー ジを 表 示 するように 変 更 してみます sub tesuto2() Dim i as long sheets( sheet2 ).activate with sheets( sheet1 ) for i=1 to 20.range( a & i)=i next end with msgbox end sub 処 理 が 終 了 しました,, "end" (5) 処 理 前 に メッセージを 表 示 し 処 理 確 認 を 行 うようにしてみます sub tesuto2() Dim i as long Dim atai as variant atai=msgbox( 開 始 します か,vbokcancel, 開 始 ) if atai=vbcancel then exit sub sheets( sheet2 ).activate with sheets( sheet1 ) for i=1 to 20.range( a & i)=i next end with msgbox 処 理 が 終 了 しました,, "end" end sub