1406 問2~問5の解答は、グレーのあみかけで示しています。 本レポート問題集では、テキストで学習したなかでも、特に、実務でよく使わ れる項目や、注意が必要なポイントについて出題しています。 誤った設問については、解答を確認する前に、再度プロシージャを実行してみ てください。エラーが発生する場合は、ステップ実行をするなどして、まず自分 でエラーの原因を探してみましょう。そのうえで、テキストの該当ページを参照 し、学習内容についての理解を徹底させてください。 VBM-01-1
業務を効率化! ExcelVBA 実践コース
レポート問題集 解答・解説
第
1
単位
<問1> 設問 ⑴ 解答:×(イ) 解説:(テキスト0ページ参照) マクロを含むブックの拡張子は「.xlsm」です。互換モード(「.xls」)を使用すること が多い場合は、マクロを含むブックを保存するときに、ファイル形式に注意しましょう。 設問 ⑵ 解答:○(ア) 解説:(テキスト3ページ参照) Functionプロシージャは処理した結果を呼び出し元に返すプロシージャで、自作の関 数を作成することもできます。 設問 ⑶ 解答:○(ア) 解説:(テキスト4ページ参照) オブジェクトの階層構造を意識してコードを記述することで、プログラムを作成する 際のミスが減り、思わぬエラーを避けることができます。 設問 ⑷ 解答:×(イ) 解説:(テキスト8、0ページ参照) データ型を指定しなかった場合、エラーが起きた原因が見つけにくくなります。変数 を宣言するときには、あらかじめデータ型を指定するようにしましょう。 設問 ⑸ 解答:×(イ) 解説:(テキスト5~6ページ参照) 配列のインデックスは0から始まるため、要素数は、「指定した値 + 1」になります。
設問 ⑹ 解答:×(イ) 解説:(テキスト9~3ページ参照) 実際のプログラミングでミスしがちな点です。条件式を指定する場合には、「=」の有 無をきちんと確認しましょう。 設問 ⑺ 解答:×(イ) 解説:(テキスト33ページ参照) 「Is」句や「To」句を使用して、値の範囲を指定することができます。また、「,(カン マ)」で区切って複数の条件を指定することもできます。 設問 ⑻ 解答:○(ア) 解説:(テキスト36ページ参照) 「Step」句には負の値を指定することもできます。省略した場合は、1ずつ増加され ます。「Step」句は単純な繰り返し処理では使用しないことも多いですが、処理を逆順 に行いたい場合などに使用する大切なキーワードです。 設問 ⑼ 解答:○(ア) 解説:(テキスト38ページ参照) For Each Nextステートメントは、繰り返し処理の対象がグループであることが重要な ポイントです。 設問 ⑽
<問2> 設問 ⑴ 解答: Sub Q__() ’Rangeオブジェクトを使用してセルAとC6を選択する Range("A,C6").Select End Sub 解説:(テキスト46~47ページ参照) 離れたセルを指定する場合は、「:」ではなく、「,」を使用します。 なお、テキストでは「Range プロパティ」と表現していますが、「Range オブジェクト」 も同義ととらえてかまいません。より正確に表現すると、Range プロパティを使用して 取得できるセル(オブジェクト)が、Range オブジェクトになります。 設問 ⑵ 解答: Sub Q__() ’ 「Sheet」ワークシートにある社員名簿のセルBからC6を ’ 「Sheet」ワークシートのセルA0以降にコピーして貼り付ける(Pasteメソッドは使用し ない) Range("B:C6").Copy Range("A0") End Sub 解説:(テキスト53~56ページ参照) 単発のコピー処理であれば、Pasteメソッドを使用するよりも、Copyメソッドを使用 したほうが効率的です。 なお、テキストでは触れていませんが、引数名を明示して、つぎのように記述しても 正解となります。 Range("B:C6").Copy Destination:= Range("A0")
設問 ⑶ 解答: Sub Q__3() ’セルAをコピーする Range("A").Copy ’セルBからCに書式のみ貼り付ける Range("B:C").PasteSpecial xlPasteFormats End Sub 解説:(テキスト53~56ページ参照) コピーしたセルを「形式を選択して貼り付け」するには、PasteSpecialメソッドを使 用します。書式のみ貼り付ける場合には、「xlPasteFormats」を引数に指定します。実務 でもよく行う作業ですので、指定のしかたを確認しておきましょう。 設問 ⑷ 解答: Sub Q__4() ’セルEの値のみをコピーしてセルB8に貼り付ける(Copyメソッドは使用しない) Range("B8").Value = Range("E").Value End Sub 解説:(テキスト49、57ページ参照) 実務でも、数式を入力したセルの結果だけを貼り付けたいという場合がよくありま す。Valueプロパティを使用した値の貼り付けは記述が簡単で便利ですので、覚えてお くとよいでしょう。 なお、テキストでは触れていませんが、Valueを省略しても同じように動作します。 ただし、「動作する」というだけで、よい記述のしかたとはいえない(また、現在では 一般的ではない)ため、不正解とします。
設問 ⑸ 解答: Sub Q__5() ’実線で格子の罫線をセルAからC6の表全体に引く Range("A:C6").Borders.LineStyle = xlContinuous ’二点鎖線の罫線を表の行め(セルAからC)の下側に引く Range("A:C").Borders(xlEdgeBottom).LineStyle = xlDashDotDot End Sub 解説:(テキスト63~65ページ参照) Bordersプロパティで、セルの個々の罫線を設定することができます。引数を省略し た場合は、格子状に罫線が設定されます。LineStyleプロパティで罫線の種類を指定しま す。本設問のように、表などに罫線を設定する場合は、まず全体を指定し、そのあと個 別の設定を行うとよいでしょう。 <問3> 設問 ⑴ 解答: Sub Q_3_() ’削除後警告のメッセージを非表示にする Application.DisplayAlerts = False ’ 「3月」ワークシートを削除する Worksheets("3月").Delete ’削除後警告のメッセージを表示する Application.DisplayAlerts = True End Sub 解説:(テキスト7~74ページ参照) ワークシートを削除する場合、「警告」のメッセージを非表示にするコードも記述する ことが大切です。プロシージャの終了後もその設定は有効になるため、ワークシートを削 除したあとに、「警告」のメッセージを表示する設定に戻す必要があります。この一連の 処理は、まとめて覚えておきましょう。
設問 ⑵ 解答: Sub Q_3_() ’ 「4月」ワークシートのコピーをブックの一番右端に作成する Worksheets("4月").Copy After:=Worksheets(Worksheets.Count) ’コピーしたワークシートの名前を「6月」にする Worksheets(Worksheets.Count).Name = "6月" End Sub ※「After」は、大文字・小文字を区別しません。 解説:(テキスト75~76ページ参照) ワークシートをコピーするときの引数の指定方法について確認しました。Countプロ パティで取得した値を、Worksheetsプロパティのインデックス番号として指定できる点 がポイントです。また、ワークシート名の設定方法についても、あわせて確認しておき ましょう。
設問 ⑶ 解答: Sub Q_3_3() Dim FileName As String Dim Book As Workbook ’ [ファイルを開く]ダイアログボックスを表示し、選択されたブックのパスを変数 FileNameに代入する ’ダイアログボックスに表示されるファイルの種類は「Excelファイル("Excelブック,*. xlsx")」を指定する FileName = Application.GetOpenFilename("Excelブック,*.xlsx") ’選択されたブックを開き、変数Bookに代入する Set Book = Workbooks.Open(FileName) MsgBox Book.Worksheets().Range("A").Value Book.Close End Sub 解説:(テキスト80~83ページ参照) 「ファイルを開く」ダイアログボックスを表示する処理は、業務用のプログラムを作 成する際にも頻出するため、覚えておくとよいでしょう。 また、ブックを開くと、開いたブックがアクティブになります。そのため、アクティ ブブックに対する処理を行うコードを記述してしまいがちですが、これはエラーの原因 になります。ブックを開く処理を行う際には、開くと同時に変数に代入することが大切 です。
設問 ⑷ 解答: Sub Q_3_4() Dim Book As Workbook ’新規ブックを追加して、変数Bookに代入する Set Book = Workbooks.Add ’追加したブックを「保存データ.xlsx」という名前で、「-3.xlsm」ブックと同じフォルダー に保存する ‘なお、「-3.xlsm」ブックが保存されているフォルダーは、Pathプロパティを使用して取 得すること Book.SaveAs ThisWorkbook.Path & "¥" & "保存データ.xlsx" End Sub 解説:(テキスト84~86ページ参照) ブックを追加したときに、変数に代入しています。こうすることで、そのあとの処理 を確実に行うことができます。Addメソッドだけでなく、この一連の流れを確認してお きましょう。 また、名前を付けてブックを保存する処理も、プログラム作成時に大切な処理です。 覚えておきましょう。 なお、「& "¥" & "保存データ.xlsx"」の部分は、「& "¥保存データ.xlsx"」と記述して も正解となります。また、テキストでは触れていませんが、「& "¥" &」の部分をつぎの ように記述することもできます。 & Application.PathSeparator & ※PathSeparatorプロパティは、区切り文字(¥)を表します。
<問4> 設問 ⑴ 解答: Sub Q_4_() Dim num As Long ’セルAからA6に入力されているデータの個数をCOUNTAワークシート関数を用いて取得 し、変数numに代入する ’なお、引数にはRangeオブジェクトを使用し、「:」を使った形式でセル範囲を指定する こと num = Application.WorksheetFunction.CountA(Range("A:A6")) MsgBox "人数:" & num End Sub 解説:(テキスト96~97ページ参照) ワークシート関数をVBAで利用するには、WorksheetFunctionオブジェクトのメソッ ドを使用します。VBAでワークシート関数を利用できると、Excelのワークシートを操 作する感覚で関数を使うことができるため、とても便利です。
設問 ⑵ 解答: Sub Q_4_() Dim temp As String Dim pos As Long Dim vName As String Dim i As Long For i = To 6 temp = Cells(i, ).Value ’半角スペースの位置をInStrRev関数を使用して取得し、変数posに代入する pos = InStrRev(temp, " ") ’ 「氏名」から「名」のみを取得して変数vNameに代入する vName = Right(temp, Len(temp) - pos) Debug.Print vName Next End Sub 解説:(テキスト00~03ページ参照) テキストで紹介している、ブックのフルパスからファイル名のみを取得するプロシー ジャの応用です。たとえば、住所から県名のみを取り出すなど、ある文字を区切り文字 としてその前後のいずれかの文字を取り出すという処理は、実務でもよく登場します。 コードの記述方法をきちんと理解しておきましょう。 なお、InStrRev関数を使用する指示が特になければ、InStr関数を使用して、つぎのよ うに記述することもできます。 pos = InStr(temp, " ")
設問 ⑶ 解答: Sub Q_4_3() Dim Target As Range Dim temp As String Dim i As Long For Each Target In Range("C:C6") ’セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプ ロパティを使って取得する temp = StrConv(Target.Value, vbWide) ’置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する Target.Value = Replace(temp, " ", " ") Next End Sub 解説:(テキスト04~08ページ参照) 文字列の変換と置換を1つのプロシージャ内で行っています。文字列を変換するには StrConv関数を、置換するにはReplace関数を使用します。文字列操作は、このように複 数の処理を組み合わせて行うことがよくあります。
設問 ⑷ 解答: Sub Q_4_4() Dim temp As Date Dim vStr As String ’本日の日付から30日後の日付を求め、変数tempに代入する temp = DateAdd("d", 30, Date) ’変数tempの値の書式を「yyyy/mm/dd」にして変数vStrに代入する vStr = Format(temp, "yyyy/mm/dd") MsgBox "30日後:" & vStr End Sub 解説:(テキスト~6ページ参照) 日付の処理は、業務でも必須のものです。そのため、DateAdd関数について、テキス トとは少し異なる応用問題で確認しました。また、ここで行っているように、日付の フォーマットを整えることは、書類を作成するうえで大切なことです。Format関数を使っ た表示形式の設定もできるようにしておきましょう。 <問5> 設問 ⑴ 解答: Private Sub Workbook_Open() With Worksheets("Sheet") .Activate
解説:(テキスト3~35ページ参照) [プロジェクトエクスプローラ]で「ThisWorkbook」ブックモジュールをクリックし て[コードウィンドウ]を開き、「Openイベント」プロシージャにコードを記述します。 Endプロパティを使用して表の最終行を取得する処理、Offsetプロパティを使用して最 終行の1つ下のセルを取得する処理は、プログラムで表を扱う際に必須の処理です。こ こでは、Withステートメントを使用して記述を省略していることに注意しましょう。 なお、テキストでは触れていませんが、つぎのように記述しても正解となります。 .Range("A" & .Rows.Count).End(xlUp).Offset().Select .Cells(.Rows.Count,"A").End(xlUp).Offset().Select 設問 ⑵ 解答: Private Sub Worksheet_Change(ByVal Target As Range) With Range("A").CurrentRegion If Not Intersect(Target, .Columns("A")) Is Nothing Then If Len(Target.Value) <> 5 Then MsgBox "会員番号は5桁の値です" ’イベント処理が発生しないようにする Application.EnableEvents = False ’入力されたセルの値のみ削除する(書式は削除しない) Target.ClearContents ’イベント処理が発生するようにする Application.EnableEvents = True End If End If End With End Sub 解説:(テキスト36~4ページ参照) [プロジェクトエクスプローラ]で「Sheet」シートモジュールをクリックして[コー ドウィンドウ]を開き、「Changeイベント」プロシージャにコードを記述します。
セルの内容だけを削除したい場合は、ClearContentsメソッドを使用します。また、 Changeイベント内でセルに対する処理を行うときには、イベントが発生しないようにす ることが大切です。この処理を行わなくてもプログラムが動作することはありますが、 その場合、必ずムダな処理が発生します。イベントを有効に戻しておくことも忘れない ようにしましょう。 設問 ⑶ 解答: Sub Q_5_3() Dim sh As Worksheet ’エラーが発生したときに、ラベル(ErrHdl)にジャンプして処理を行う On Error GoTo ErrHdl Set sh = Worksheets("名簿") sh.Activate MsgBox "処理を終了します" ’プロシージャを抜けて処理を終了する Exit Sub ErrHdl: MsgBox "エラーが発生しました" End Sub 解説:(テキスト59~66ページ参照) エラー処理の基本的な記述方法を確認しました。このプロシージャは、「名簿」とい