みなさんこんにちはhideo18です。
今回はExcelを使っている皆さんのこんな問題を解決したいと思います。
- 一つのセルに住所情報が全て入ってしまうと、別のシステムとマッチングできない。
- 特定の場所でセルを分割したい
- コードの解説も知りたい
そんなお困りを解決するExcelのVBA コードです。
1 Dim ws As Worksheet
2 Set ws = ThisWorkbook.Sheets("住所")
3
4 Dim lastRow As Long
5 lastRow = ws.Cells(ws.Rows.Count, "I").End(xlUp).Row
6
7 Dim i As Long
8 Dim numCharsI As Long
9 Dim currentLengthJ As Long
10
11 For i = 1 To lastRow
12 numCharsI = Len(ws.Cells(i, 9).Value) ' I列の文字数を取得
13 currentLengthJ = Len(ws.Cells(i, 10).Value) ' J列の現在の文字数を取得
14
15 If currentLengthJ > numCharsI Then
16 ws.Cells(i, 10).Value = Right(ws.Cells(i, 10).Value, currentLengthJ - numCharsI)
17 ElseIf currentLengthJ <= numCharsI Then
18 ws.Cells(i, 10).Value = "" ' J列の文字数がI列の文字数以下の場合、J列を空にする
19 End If
20 Next i
まずはゴールをイメージ
こんな感じのことをしたい。
※i行目に抜き出したい住所を記載しておく必要があります。
列ごとのコードを解説
1 Dim ws As Worksheet
Dim
:これは「Dimension」の略で、VBAで変数を宣言するために使われるキーワードです。
ここではwsがWorkSheetであることを宣言しています。
変数の型宣言: Dim
による変数宣言では、変数がどのような種類のデータ(この場合は Worksheet
オブジェクト)を保持するかを指定します。
数値型、文字列型などの基本データ型やWorksheet、Workbookなどのオブジェクト型があります。
ws
:これは変数名です。このコードではws
という名前の変数が作成されていますが、これは任意で他の名前を使用することもできます。ちなみにwsはワークシートの略です。As Worksheet
:これは変数の型を指定しています。ここではws
がWorksheet
オブジェクトを参照することを意味しています。
ーーー
2 Set ws = ThisWorkbook.Sheets("住所")
この行は「現在のワークブック(ThisWorkbook
)の中で “住所” という名前のワークシートを ws
という変数に割り当てる」という意味になります。
Set
:これはVBAにおいてオブジェクト変数に特定のオブジェクトを割り当てる際に使用されるキーワードです。
基本データ型の場合
Dim myNumber As Integer
myNumber = 10
Dim myString As String
myString = "こんにちは"
という感じでSet
という形はとっていません。
ws
:これは以前にDim ws As Worksheet
として宣言されたWorksheetオブジェクト型の変数です。ThisWorkbook
:これはVBAコードが実行されている現在のワークブックを指します。Sheets("住所")
:これはワークブック内の “住所” という名前のワークシートを指します。
ーーー
4 Dim lastRow As Long
lastRowという変数名にはLongという変数型を指定したことになります。
つまり”lastRow”には-2,147,483,648 から 2,147,483,647 までの整数値しか入らないことになります。
lastRow
:これは宣言される変数の名前です。この名前はユーザーが自由に付けることができます。
Long
だと長すぎるので、Integer
:-32,768 ~ 32,767やByte
:0 ~ 255を使う場合もあります。
As Long
:これは宣言される変数の型を指定しています。Long
は整数型で、範囲が -2,147,483,648 から 2,147,483,647 までの整数値を格納することができます。
ーーー
5 lastRow = ws.Cells(ws.Rows.Count, "I").End(xlUp).Row
このコードは、 “I” 列で最下行の行番号を見つけるために使用されます。
lastRow
:この変数は、計算された最終行の行番号を格納するために使用されます。ws
:これはWorksheet
オブジェクトを参照する変数です。
ここではSet ws = ThisWorkbook.Sheets("住所")
つまり住所というシートであると設定されています。ws.Cells(ws.Rows.Count, "I")
:これは指定されたワークシートws
の “I” 列で最も下のセルを参照します。ws.Rows.Count
はワークシートの行数を返し、”I” は列を指定しています。
Cells
メソッドは、一般に Cells(行番号, 列番号)
の形式で使用されます。
ここで、行番号と列番号は数値または列のアルファベットで指定されます。
ws.Rows.Count
:これは指定されたワークシート ws
の全行数を返します。
.End(xlUp)
:これは、選択されたセルから上に向かって最初の空白でないセルを探します。
これはExcelのショートカットキー「Ctrl + ↑」に相当します。.Row
:これは、見つかったセルの行番号を返します。
つまり空白でない最初のセルの行をlastLowに返すことになります。
ーーー
7 Dim i As Long
8 Dim numCharsI As Long
9 Dim currentLengthJ As Long
i
、numCharsI
、currentLengthJ
それぞれの変数名にはLongという変数型を指定したことになります。
ーーー
11 For i = 1 To lastRow
︙
20 Next i
For
はループの開始を宣言します。i
はループカウンタ変数です。
これは通常、ループ内の各繰り返しで使用される変数です。1
はループの開始値です。
この例では、ループはi
が 1 の値から開始します。To lastRow
はループの終了条件を示します。lastRow
は、下から見ていって空白でない最初のセル変数であり、ループがこの値に達するまで繰り返されます。Next i
までのまとまりをlastRow
まで繰り返すことになります。
ーーー
12 numCharsI = Len(ws.Cells(i, 9).Value)
ws
ワークシートの “I” 列の i
行目のセルにあるテキストの長さを numCharsI
変数に格納しています。
numCharsI
:これはLongという変数型を指定した変数で、この行で計算された値が格納されます。Len
:これはVBAの組み込み関数で、引数として与えられた文字列の長さ(文字数)を返します。
引数:関数やメソッドに渡される値や変数のことを指します。
Sub SetValueToRange(sheetName As String, cellAddress As String, value As Variant)
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(sheetName)
ws.Range(cellAddress).Value = value
End Sub
このコードだと3つの引数が使用されています
sheetName
: 値を設定するシートの名前。cellAddress
: 値を設定するセルのアドレス。value
: セルに設定する値。
ws.Cells(i, 9).Value
:ここで、ws
はWorksheetオブジェクトを参照する変数、Cells
は特定のセルを参照するメソッドです。i
は行番号、9
は列番号を表します(9は “I” 列を指す)。つまり、ws.Cells(i, 9).Value
は、ワークシートws
の “I” 列のi
行目にあるセルの値を表します。
ーーー
13 currentLengthJ = Len(ws.Cells(i, 10).Value) ' J列の現在の文字数を取得
指定されたワークシートのi行目のJ列にあるセルの内容の文字数を計算し、その値を currentLengthJ
に格納するという処理を行なっています。
ws
: これはワークシートオブジェクトを参照する変数です。Cells(i, 10).Value
: これは、ws
ワークシートのi行目、10列目(J列)のセルの値を取得します。i
については、11行目で定義しています。Len(...)
:Len
関数は、括弧内の文字列の長さ(文字数)を返します。
この場合、指定されたセルの内容の長さを返します。currentLengthJ
: これは、計算された文字列の長さを格納するための変数です。
currentLengthJ
には ws
で定義されたのシートの10列目の文字数が格納されます。
ーーー
15 If currentLengthJ > numCharsI Then
この条件文 If currentLengthJ > numCharsI Then
の意味は、「もしJ列のセルの文字数(currentLengthJ
)がI列のセルの文字数(numCharsI
)より大きい場合、次のコード行を実行する」ということです。
currentLengthJ
: これは、J列の特定のセルの文字列の長さを格納する変数です。numCharsI
: これは、I列の特定のセルの文字列の長さを格納する変数です。
ーーー
16 ws.Cells(i, 10).Value = Right(ws.Cells(i, 10).Value, currentLengthJ - numCharsI)
J列のセルの文字列の右側から特定の数の文字を取得し、そのセルに新しい値を設定します。
ws.Cells(i, 10).Value
: これは、ワークシートws
のi行目、10列目(J列)のセルの値を参照します。Right(...)
:Right
関数は、指定された文字列の右側から特定の数の文字を取得します。ws.Cells(i, 10).Value, currentLengthJ - numCharsI
: ここでは、J列のセルの値(ws.Cells(i, 10).Value
)の右側からcurrentLengthJ - numCharsI
文字を取得します。currentLengthJ
はJ列のセルの文字数、numCharsI
はI列のセルの文字数です。
したがって、この式はJ列のセルから、I列のセルの文字数を引いた残りの文字を取得します。ws.Cells(i, 10).Value = ...
: 最後に、計算された新しい文字列(Right
関数によって取得された文字列)をJ列の同じセルに設定します。
ーーー
17 ElseIf currentLengthJ <= numCharsI Then
もしJ列のセルの文字数が、I列のセルの文字数以下である場合、次のコード行を実行するということです。
<=
:以下という意味です。
ーーー
18 ws.Cells(i, 10).Value = ""
特定のセル(10列目のi行のセル)の値を空白に設定しています。