仕事に活用できるExcelマクロ

実践的なExcelマクロ、活用方法などを情報発信するサイト

【Excel VBA】MkDir ステートメント

 MkDir ステートメントによってフォルダーを作成することができます。

【構文】

MkDir フォルダー名

Sub フォルダーの作成()
'
'変数の宣言 ----------
Dim foName As String

foName = "MyFolder"

  'フォルダーを作成する ----------
      MsgBox (foName & "のフォルダーを作成します。"), vbInformation
      MkDir ThisWorkbook.Path & "\" & foName
  End If

End Sub

 上記のコードは、変数 foName に"MyFolder"というフォルダー名の代入しています。

 その後、MkDir ステートメント にワークブックの直下を表すActiveWorkbookというパス名と変数 foNameを合算させて"MyFolder"というフォルダーを作成させています。

【Excel VBA】Dir 関数

 Dir 関数によって指定したパス名と属性が一致すると戻り値を返します。

 主に所定のフォルダーまたは、ファイルが存在するかの判定で使われることが多いと思います。

構文

 Dir(引数(パス名).引数(属性))

パラメータ 内容
引数(パス名) ファイルやフォルダのパスを指定します。
引数(属性) ファイルの属性を組み合わせて指定します。
戻り値のタイプ 文字列型 (String)

 引数(パス名)は、"C:\Dir\Sampie.pdf"のようにパス名+指定するフォルダー名、ファイル名となります。(指定するフォルダー名、ファイル名には * や ? のワイルドカードとすることも可能です)

※「ThisWorkbook.Path」とした場合は、Excelブックのあるフォルダーのパス名となります。

 引数(属性)は、省略すると vbNormal として扱われます。

引数(属性) 内容
vbNormal 0 標準ファイル(既定値)
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システムファイル
vbVolume 8 ボリュームラベル
vbDirectory 16 フォルダ

 

 

 

【ファイル操作】フォルダーの作成と削除

 【ファイル操作】における基本中の基本であるフォルダーの作成と削除を行うコードを紹介します。

1.フォルダーの作成

Sub フォルダーの作成()
'
'変数の宣言 ----------
Dim foName As String
Dim foPath As String

foName = "MyFolder"
foPath = ActiveWorkbook.Path & "\" & foName

'フォルダーの有無を判定する ----------
  If Dir(foPath, vbDirectory) = "" Then
  '「無し」の場合は、フォルダーを作成する ----------
      MsgBox (foName & "のフォルダーを作成します。"), vbInformation
      MkDir ThisWorkbook.Path & "\" & foName
  Else
  '「有り」の場合は、メッセージボックスを表示する ----------
      MsgBox (foName & "のフォルダーは既に存在しています。"), vbInformation
  End If

End Sub

 Dir 関数によってワークシートと同じフォルダー内に「MyFolder」の有無を判定します。

 なしの場合にMkDir ステートメントによってフォルダーを作成し、既にそのフォルダーが存在する場合は、メッセージを表示します。

2.フォルダーの削除

Sub フォルダーの削除()
'
'変数の宣言 ----------
Dim foName As String
Dim foPath As String

foName = "MyFolder"
foPath = ActiveWorkbook.Path & "\" & foName

'フォルダーの有無を判定する ----------
  If Dir(foPath, vbDirectory) = "" Then
  '「無し」の場合はメッセージボックスを表示する ----------
      MsgBox (foName & "のフォルダーは、存在しません。"), vbInformation
  Else
  '「有り」の場合は、フォルダーを削除する ----------
      MsgBox (foName & "のフォルダーを削除します。"), vbInformation
      RmDir ThisWorkbook.Path & "\" & foName
  End If

End Sub

 先ほどのコードと違うのは、フォルダーの存在がありの場合にRmDir ステートメントによってフォルダーを削除する処理をおこなっていることです。

 

【Excel VBA】「WorksheetFinction.Replase」メソッド

 文字列操作には欠かせない文字の置き換えを行うコードを紹介します。

 文字の置き換えは、Excelの機能にも備えられているので「WorksheetFinction」オブジェクトに「Replase」メソッドを指定します。

文字列の置き換えを行う

【構文】

 WorksheetFinction.Replase(,,,)

  1. 置き換えを行う文字列を指定します。変数の指定も可能ですがデータ型は Steing である必要があります。
  2. 置き換える文字の位置を指定します。先頭の文字は、1と数えます。
  3. 置き換える文字の数を指定します。2 で指定した文字列の位置を1として置き換える文字の数になります。
  4. 置き換え後の文字列を指定します。変数の指定も可能ですがデータ型は Steing である必要があります。

 ①~④のパラメータは、省略は不可です。すべて指定する必要があります。

【Excel VBA】「NumberFormatLocal」 プロパティ

 「NumberFormatLocal」 プロパティによってExcelシート上のセルにおける表示形式を設定することができます。

 表示形式を変えることでセルに入力されている情報の見た目を様々な形にすることができます。

 例えば、「2020/3/6」でも「2020年3月6日」、「令和2年3月6日」とセルの設定しだいで見かけ上の表示を変えることができます。

セルの表示形式を設定する

構文

 Rangeオブジェクト.NumberFormatLocal=”表示形式

f:id:Yuki_Kaze:20200306222757j:plain

 上記のように指定する表示形式は、セルの書式設定におけるユーザー定義のものと同じです。

【コードの例1】

 Range("A1").NumberFormatLocal="0.00"

   A1のセルについて入力値を小数点第2位まで表示します。

 セル A1 の値が 10 の場合は、10.00 と表示されます。

 【コードの例2】

Dim conStr As Range
 conStr="B1"
 conStr.NumberFormatLocal="yyyy年m月d日"

 変数の宣言で変数 conStr を Range オブジェクト として宣言し、その後に変数 conStr に B1 を代入します。

 「NumberFormatLocal」 プロパティにその変数を Range オブジェクト として指定し、表示形式を yyyy/m/d に設定しています。

 セル B1 の値が「2020/3/6」の場合は、「2020年3月6日」と表示されます。

【文字列操作】数字を漢数字に変換する

 文字列操作として数字を漢数字に変換するコードを紹介します。

 使う機会は少ないかと思いますがこのコードは、セルの書式を設定することで変換をおこなっています。

Sub 数字の変換()
'
'数字の変換
'
'変数の宣言 ----------
Dim cllAre As Range'数字の変換を行う範囲の変数 cllAre  ----------

Set cllAre = Range("A1", "A" & Cells(Rows.Count, 1).End(xlUp).Row)'データが入力されている範囲を参照し範囲を変数 cllAre に代入する  ----------
  cllAre.NumberFormatLocal = "[DBNum1]"'数値を漢数字にする書式を設定する ----------
 Columns.AutoFit’セルの幅に文字が収まるように幅を設定する ----------

End Sub

 「NumberFormatLocal」プロパティは、セルの書式を操作します。

 例をあげるなら

 Range("A1").NumberFormatLocal = "yyyy/m/d"

 ならば「A1のセルを年月日の書式に設定する」というコードになります。

 漢数字に変換の場合は、以下のようなコードを指定します。  

  • [DBNum1] 123 → 百二十三
  • [DBNum1]# 123 → 一ニ三
  • [DBNum2] 123 → 壱百弐拾参
  • [DBNum2]# 123 → 壱弐参
  • G/標準 数字に戻します。

「NumberFormatLocal」プロパティの詳細は、以下のリンクにて解説しています。 

ez-info.hatenablog.com


ez-info.hatenablog.com

【文字列操作】英数字→半角、カタカナ→全角に変換する

英数字→半角、カタカナ→全角に変換する

 文字列の操作として英数字を半角にカタカナを全角にするコードを紹介します。

 Excelの表に入力された情報を整理する処理が必要になることがあるかと思います。

 それに半角のカタカナは、環境によって文字化けする可能性があるし、インターネット上でのやり取りで問題があるので全角に変換したいところです。

Sub 文字の変換()
'
'文字の変換
'
'変数の宣言 ----------

Dim cllStr As Range 'cllStrのExcelシート上のアドレスを代入する変数 cllStr ----------
Dim conStr As String 'カタカナ→全角に変換した文字を代入する変数 conStr ----------
Dim halStr As String '英数字→halStrに変換した文字を代入する変数 halStr ----------
Dim i As Long

'変換する文字の範囲を選択する ----------
Range("A1").CurrentRegion.Select
Selection.Offset(1).Resize(Selection.Rows.Count - 1).Select

'英数字→半角、カタカナ→全角に変換する ----------

For Each cllStr In Selection
    conStr = StrConv(cllStr.Text, vbWide) '文字を全角に変換する ----------
    For i = 1 To Len(conStr)
       halStr = StrConv(Mid(conStr, i, 1), vbNarrow) '全角→halStrに変換に変換する(カタカナは、変換しない) ----------
       If Asc(halStr) >= 32 And Asc(halStr) <= 126 Then _
       conStr = WorksheetFunction.Replace(conStr, i, 1, halStr)
    Next i
    cllStr = conStr
Next

End Sub

  「WorksheetFunction.Replaceメソッド の詳細は、以下のリンクにて解説しています。 

ez-info.hatenablog.com