エクセルVBA:特定の場所でセルを分けたい

みなさんこんにちは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:これは変数の型を指定しています。ここでは wsWorksheet オブジェクトを参照することを意味しています。

ーーー

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

inumCharsIcurrentLengthJそれぞれの変数名には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つの引数が使用されています

  1. sheetName: 値を設定するシートの名前。
  2. cellAddress: 値を設定するセルのアドレス。
  3. 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 に格納するという処理を行なっています。

  1. ws: これはワークシートオブジェクトを参照する変数です。
  2. Cells(i, 10).Value: これは、ws ワークシートのi行目、10列目(J列)のセルの値を取得します。
    i については、11行目で定義しています。
  3. Len(...): Len 関数は、括弧内の文字列の長さ(文字数)を返します。
    この場合、指定されたセルの内容の長さを返します。
  4. 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行のセル)の値を空白に設定しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です