Excel VBA セル操作

Excel VBA のトップに戻る
Excel VBA 目次

Excelの最終行を取得
行列処理
 ・同上の補完
 ・変数を使って、セルを指定する方法
セル範囲を、配列に一括登録、およびその逆
行列入れ替えコピー
 ・連立1次方程式の解
 ・子供の血液型の出現率
Excel関数の VLOOKUP をマクロで
選択範囲を取得し、A1形式で表示
セルのデータチェック
セルの文字検索と置換
指定フォルダの全てのExcelブックを対象に、検索して置換する
セルデータの集計と文字検索
並び替え+重複行削除
使っている全てのセルを指定する

キーのトップと属性の重複を摘出

索引


選択範囲を取得し、A1形式で表示

 「Excel VBAサンプルマクロ集」の 第1章1ページ目に掲載されているサンプルです。
 現在選択されているセルのアドレスを、ダイアログに表示します。


Option Explicit
Sub 選択範囲を取得し、A1形式で表示()
    Dim 選択範囲 As Range
    If TypeName(Selection) = "Range" Then
        Set 選択範囲 = Selection
        MsgBox 選択範囲.Address
    Else
        MsgBox "セルが選択されていません"
    End If
    Set 選択範囲 = Nothing 'オブジェクトの解放
End Sub

 解説:
 Address プロパティを Range オブジェクトに指定した場合、セルの範囲参照を返します。値の取得のみ可能です。文字列型 (String) の値を使用します。

expression.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)

 expression 必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。

 RowAbsolute 省略可能です。バリアント型 (Variant) の値を使用します。行部分の参照を絶対参照として返すには、True を指定します。既定値は True です。
 ColumnAbsolute 省略可能です。バリアント型 (Variant) の値を使用します。列部分の参照を絶対参照として返すには、True を指定します。既定値は True です。
 ReferenceStyle 省略可能です。XlReferenceStyle クラスの定数を使用します。

 使用できる定数は、次に示す XlReferenceStyle クラスのいずれかです。
xlA1 (既定値) xlA1 を指定すると、A1 形式の参照で返されます。
xlR1C1 xlR1C1 を指定すると、R1C1 形式の参照で返されます。

 External 省略可能です。バリアント型 (Variant) の値を使用します。外部参照を返すには、True を指定します。ローカル参照を返すには、False を指定します。既定値は False です。
 RelativeTo 省略可能です。バリアント型 (Variant) の値を使用します。引数 RowAbsolute と引数 ColumnAbsolute に False が指定されていて、引数 ReferenceStyle に xlR1C1 が設定されていると、相対参照の開始点を含める必要があります。この引数は、開始点を定義する Range オブジェクトです。

 注意:
 参照に複数のセルが含まれている場合は、引数 RowAbsolute と引数 ColumnAbsolute にはすべての行と列が適用されます。

 次の例は、シート 1 の同じセル アドレスを 4 つの異なる方法で表します。コード中のコメントは、メッセージで表示されるアドレスを示しています。

Set mc = Worksheets("Sheet1").Cells(1, 1)
MsgBox mc.Address()                              ' $A$1
MsgBox mc.Address(RowAbsolute:=False)            ' $A1
MsgBox mc.Address(ReferenceStyle:=xlR1C1)        ' R1C1
MsgBox mc.Address(ReferenceStyle:=xlR1C1, _
    RowAbsolute:=False,     _
    ColumnAbsolute:=False,  _
    RelativeTo:=Worksheets(1).Cells(3, 3))        ' R[-2]C[-2]

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


セルのデータチェック

 データの属性をチェックして、該当しないセルを見つけて、画面上で特定できるように表示します。表示画面より下の行で隠れて見えない場合にも、画面の上から10行目にエラーデータのセルが表示されるように、自動でスクロールします。
 (データの修正は、アクティブになっているエラー部分を、上書き修正します。)
 このExcelをダウンロードできます。→DataCheck.xls
セルのデータチェック

Sub セルのデータチェック()
    Dim チェック対象セル範囲 As Range
    Dim 行 As Integer
    Dim 移動行 As Integer
    Dim 列 As Integer
    Dim メッセージ As String
    Dim タイトル As String
    Dim 返答 As Integer
    
    '範囲を表す変数にアクティブセル領域への参照を代入します。
    Range("A1").Select
    Set チェック対象セル範囲 = ActiveCell.CurrentRegion
    ActiveCell.CurrentRegion.Interior.ColorIndex = 6
        メッセージ = "データ部分の行数は、" & チェック対象セル範囲.Rows.Count - 1 & "です。"
        タイトル = "データ行数確認"
        返答 = MsgBox(メッセージ, vbInformation + vbYesNo, タイトル)
        'vbInformation は、情報メッセージ アイコン。 
        'vbYesNo は、[はい] と [いいえ] のボタンを表示。
        If 返答 = 7 Then Exit Sub ' 6*Yes, 7:No
        
    For 列 = 1 To 3
        For 行 = 2 To チェック対象セル範囲.Rows.Count - 1
        
        Select CaseCase 1
        '「在庫数」列の各セルを検査します。
            If Not (IsNumeric(Range("A2").Cells(行, 列).Value)) _
            Or Trim(Range("A2").Cells(行, 列).Value) = "" Then

                MsgBox "「在庫数」列に数値以外のデータが見つかりました。"
                If 行 <= 10 Then 移動行 = 1 Else 移動行 = 行 - 10
                ActiveWindow.ScrollRow = 移動行
                Range("A2").Cells(行, 列).Activate
                Exit Sub
            End If
            
        Case 2
            '「注文中」列の各セルを検査します。
            If Not (Range("A2").Cells(行, 列).Value = "済み" _
                 Or Range("A2").Cells(行, 列).Value = "未") Then
                MsgBox "「注文中」列に指定(済みor未)以外のデータが見つかりました。"
                If 行 <= 10 Then 移動行 = 1 Else 移動行 = 行 - 10
                ActiveWindow.ScrollRow = 移動行
                Range("A2").Cells(行, 列).Activate
                Exit Sub
            End If
            
        Case 3
            '「品目番号」列の各セルを検査します。
                If Not (IsNumeric(Left(Range("A2").Cells(行, 列).Value, 5))) _
                Or Len(Range("A2").Cells(行, 列).Value) <> 10 Then
                MsgBox "「品目番号」が10桁でないか、または最初の5文字に、数値以外が有ります。"
                If 行 <= 10 Then 移動行 = 1 Else 移動行 = 行 - 10
                ActiveWindow.ScrollRow = 移動行
                Range("A2").Cells(行, 列).Activate
                Exit Sub
            End If
        End Select
        Next 行
    Next 列
End Sub

 解説:

カラー パレットのインデックス番号  ColorIndex プロパティは、オブジェクトに応じて、輪郭線、フォント、罫線、内部の塗りつぶしなどに適用する色を設定します。
 セルの背景色を無色に設定したいときは、値に xlColorIndexNone を指定します。
 フォントの色を黒(自動)に設定したいときは、値に xlAutomatic を指定します。

 PatternColorIndex プロパティは、オブジェクト内部の塗りつぶし属性のパターンの色を、カラー パレットのインデックス番号または定数で設定します。

 ヘルプで ColorIndex または、PatternColorIndex を検索すると、標準のカラー パレットの色見本と、インデックス番号が示されます。
 色を指定するには、RGB関数を使うこともできます。

 MsgBox 関数は、整数型 (Integer) の値を返します。ダイアログ ボックスにメッセージを表示し、ボタンがクリックされるのを待って、どのボタンがクリックされたのかを示す値を返します。

 MsgBox のカッコの使い方
 関数として返り値を使用するとき(上の例では、変数「返答」に、返り値を代入(=)しています)では、MsgBox の後ろに、括弧をつけます。
 しかし、返り値を使わず、画面にメッセージを表示するだけのときには、MsgBox の後ろに、括弧をつけてはいけません。(括弧をつけると、エラーになります。)

 MsgBox 関数の構文は、次の名前付き引数から構成されます。
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
 prompt は、ダイアログ ボックス内にメッセージとして表示する文字列です。名前付き引数 prompt に指定できる最大文字数は、1 バイト文字で約 1,024 文字です。ただし、使う文字の文字幅に依存します。名前付き引数 prompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。
 buttonsは、表示されるボタンの種類と個数、使用するアイコンのスタイル、標準ボタン、メッセージ ボックスがモーダルかどうかなどを表す値の合計値を示す数式を指定します。省略可能です。
 次の値のうち、該当する値を組合せて指定します。
グループ定数内容
ダイアログ ボックスに
表示される
ボタンの種類と個数
vbOKOnly[OK] ボタンのみを表示します。
vbOKCancel[OK] ボタンと [キャンセル] ボタンを表示します。
vbAbortRetryIgnore[中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
vbYesNoCancel[はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
vbYesNo[はい] ボタンと [いいえ] ボタンを表示します。
vbRetryCancel[再試行] ボタンと [キャンセル] ボタンを表示します。
アイコンの種類vbCritical警告メッセージ アイコンを表示します。
vbQuestion問い合わせメッセージ アイコンを表示します。
vbExclamation注意メッセージ アイコンを表示します。
vbInformation情報メッセージ アイコンを表示します。
標準ボタンの指定vbDefaultButton1第 1 ボタンを標準ボタンにします。
vbDefaultButton2第 2 ボタンを標準ボタンにします。
vbDefaultButton3第 3 ボタンを標準ボタンにします。
vbDefaultButton4第 4 ボタンを標準ボタンにします。
モーダルかどうかの指定vbApplicationModalアプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
vbSystemModalシステム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
表示方法vbMsgBoxHelpButtonヘルプ ボタンを追加します。
VbMsgBoxSetForeground最前面のウィンドウとして表示します。
vbMsgBoxRightテキストを右寄せで表示します。

 押されたボタンの戻り値 は、以下の値を示します。
定数説明
vbOK1[OK]
vbCancel2[キャンセル]
vbAbort3[中止]
vbRetry4[再試行]
vbIgnore5[無視]
vbYes6[はい]
vbNo7[いいえ]

コードでのかっこの使い方
 Sub プロシージャ、組み込みのステートメント、およびいくつかのメソッドは値を返さないので、指定する引数はかっこで囲みません。
 次に例を示します。
MySub "stringArgument", integerArgument

 Function プロシージャ、組み込み関数、およびいくつかのメソッドは値を返しますが、無視することができます。戻り値を無視する場合はかっこで囲まず、Sub プロシージャを呼び出すときと同じように関数を呼び出します。かっこを省略して引数を列挙すると、変数に関数を代入しません。
 次に例を示します。
MsgBox "タスクが完了しました。", 0, "タスク ボックス"

 関数の戻り値を使用するには、次の例のように引数をかっこで囲みます。

Answer3 = MsgBox("現在の給与に満足していますか ?", 4, "質問 3")

 Sub プロシージャまたは Function プロシージャのステートメントは、名前付き引数を使って、呼び出されたプロシージャに値を引き渡すことができます。名前付き引数を使用する場合も、かっこの使用方法は同じです。名前付き引数を使用する場合、それらを任意の順に指定し、省略可能な引数は省くことができます。名前付き引数を指定するには、引数名、コロンと等号 (:=)、引数に代入する値の順で記述します。

 次の例は、名前付き引数を使って MsgBox 関数を呼び出しますが、戻り値を無視します。

MsgBox Title:="タスク ボックス", Prompt:="タスクが完了しました。"

 次の例は、名前付き引数を使って MsgBox 関数を呼び出し、戻り値を変数 answer3 に代入します。

answer3 = MsgBox(Title:="質問 3", _
Prompt:="現在の給与に満足していますか ?", Buttons:=4)


 ScrollRow プロパティは、ウィンドウ枠 (ペイン) 内またはウィンドウ内で上端に表示される行の番号の値を設定します。値の取得および設定が可能です。長整数型 (Long) の値を使用します。ウィンドウを分割表示している場合、Window オブジェクトの ScrollRow プロパティは左上のウィンドウ枠を対象とします。ウィンドウ枠を固定している場合、Window オブジェクトの固定領域は対象外とされます。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


セルの文字検索と置換

 セルデータの一部を検索したり置換したいことはよくあります。
 このときには、Find メソッドと、Replace メソッドを使います。
 単純な検索では、 Like 演算子と For Each...Next ステートメントを使うと簡単です。

 次の例はセル範囲 A1:C5 で、ハイホン(-)を含むセルを検索して、該当すれば赤くします。


Option Explicit
Sub ハイホンを含むセルに色を付ける()
    Dim セル As Range
    
    For Each セル In [A1:C5]
        If セル.Value Like "*-*" Then
           セル.Interior.ColorIndex = 3 '赤色
        End If
    Next
End Sub

 次の例はセル範囲 A1:C5 でフォント名の先頭が "Arial" であるセル(例えば Arial Black)を検索し、見つかったセルのフォントを "MS ゴシック" に変更します。
 また、フォント・サイズが10でない場合は、10に置換します。


Option Explicit
Sub フォント置換と統一()
    Dim セル As Range
    
    For Each セル In [A1:C5]
        If セル.Font.Name Like "Arial*" Then
           セル.Font.Name = "MS ゴシック"
        End If
        If セル.Font.Size <> "10" Then
           セル.Font.Size = "10"
        End If
    Next
End Sub

 次の例は、シート 1 のセル範囲 A1:C5 で、値に 2 が含まれているセルを検索し、その値を 5 に変更すると同時に、赤く色をつけます。


Option Explicit
Sub データの置換()
    Dim 検索セル As Range
    Dim 開始セルアドレス As String
    
    With Range("A1:C5")
        Set 検索セル = .Find(2, LookIn:=xlValues)
        If Not 検索セル Is Nothing Then
            開始セルアドレス = 検索セル.Address
            Do
                Set 検索セル = .FindNext(検索セル)
                検索セル.Value = 5
                検索セル.Interior.ColorIndex = 3 '赤色
            Loop While Not 検索セル Is Nothing And 検索セル.Address <> 開始セルアドレス

            ' 検索は指定された範囲の最後に達すると、範囲の最初に戻って検索を繰り返します。
            '同じ範囲を繰り返して検索しないようにするには、
            '最初に検索内容が見つかったセルの位置を保存しておき、
            '次のセルが見つかるたびに、
            'そのセルの位置と保存しておいたセルの位置を比較するようにします。
        End If
    End With
    Range("A1").Activate
End Sub

 次の例は、シート 1 の列 A のセルに入力されているすべての三角法の SIN 関数を COS 関数に置換します。


Option Explicit
Sub セルの関数の置換()
    Columns("A").Replace What:="SIN", Replacement:="COS", _
        SearchOrder:=xlByColumns, MatchCase:=True:
    Range("A1").Activate
End Sub

 次の例は、セル範囲 A1:C5 で、ハイホン(-)を、縦線(|)に置換します。


Option Explicit
Sub 文字の置換()
Dim セル As Range

    For Each セル In [A1:C5]
        If セル.Value Like "*-*" Then
            セル.Replace What:="-", Replacement:="|", _
            SearchOrder:=xlByColumns, MatchCase:=True
            セル.Interior.ColorIndex = 3 '赤色
        End If
    Next
    Range("A1").Activate
End Sub

 解説:
 With ステートメントは、オブジェクトやユーザー定義型に対して、一連のステートメントを実行するフロー制御ステートメントです。

 Set ステートメントは、オブジェクトへの参照を、変数またはプロパティに代入する場合には必須です。

 FindNext メソッドは、Find メソッドによって開始された検索を継続します。前回の検索条件に一致するセルを、下方向 (行のときは左から右、列のときは上から下) に検索し、見つかったセル (Range オブジェクト) を返します。選択範囲やアクティブ セルには影響はありません。

 Find メソッドは、指定されたセル範囲の中で特定の情報を検索し、情報が見つかった最初のセル (Range オブジェクト) を返します。検索の条件にあてはまるセルが見つからなかった場合は、Nothing を返します。選択状態やアクティブ セルに影響はありません。

 expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

 expression 必ず指定します。対象となる Range オブジェクトを返すオブジェクト式を指定します。

 What 対象セル範囲内で検索するデータです。文字列など、セル内のデータに該当する値を指定します。

 After 指定したセルの次から検索が開始されます。この引数で指定するセルは、コードからではなく、通常の画面上で検索を行う場合のアクティブ セルに該当します。対象セル範囲の中の、単一セルである必要があります。検索は指定したセルの次から始まるので、指定したセル自体は、検索が範囲全体を一度検索して戻ってくるまで検索されません。この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点となります。

 LookIn 情報の種類を指定します。
 LookAt 使用できる定数は、XlLookAt クラスの xlWhole または xlPart です。
 SearchOrder 使用できる定数は、XlSearchOrder クラスの xlByRows または xlByColumns です。
 SearchDirection XlSearchDirection クラスの定数を使用します。検索の方向を指定します。
 使用できる定数は、次に示す XlSearchDirection クラスの定数のいずれかです。
xlNext (既定値)
xlPrevious

 MatchCase 大文字と小文字を区別するには、True を指定します。既定値は False です。

 MatchByte この引数は、2 バイト (全角) 文字の言語サポートが選択またはインストールされているときだけ使用できます。半角と全角を区別するには、True を指定します。区別しないようにするには、False を指定します。

 SearchFormat 検索の書式を指定します。

 注意:
 検索を繰り返すときは FindNext メソッドと FindPrevious メソッドを使うことができます。

 検索は指定された範囲の最後に達すると、範囲の最初に戻って検索を繰り返します。
同じ範囲を繰り返して検索しないようにするには、最初に検索内容が見つかったセルの位置を保存しておき、次のセルが見つかるたびに、そのセルの位置と保存しておいたセルの位置を比較するようにします。
 複雑なパターンの検索を行うには Like 演算子と For Each...Next ステートメントを使います。
たとえば、次の例はセル範囲 A1:C5 でフォント名の先頭が "Cour" であるセルを検索し、見つかったセルのフォントを "MS Pゴシック" に変更します。
For Each c In [A1:C5]
    If c.Font.Name Like "Cour*" Then
        c.Font.Name = "MS Pゴシック"
    End If
Next

次の使用例は、シート 1 のセル範囲 A1:A500 で、値に 2 が含まれているセルを検索し、その値を 5 に変更します。

With Worksheets(1).Range("a1:a500") 
       Set c = .Find(2, lookin:=xlValues) 
       If Not c Is Nothing Then 
           firstAddress = c.Address 
           Do 
              c.Value = 5 
              Set c = .FindNext(c) 
           Loop While Not c Is Nothing And c.Address <> firstAddress 
       End If 
End With

 Replace メソッドは、指定されたセル範囲内のセルの文字を示すブール型 (Boolean) の値を返します。このメソッドを使用しても、選択範囲またはアクティブ セルのどちらも変更されません。

 expression.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat)

 expression 必ず指定します。対象となる Range オブジェクトを返すオブジェクト式を指定します。

 What 必ず指定します。Excel で検索する文字列を指定します。

 Replacement 必ず指定します。置き換える文字列を指定します。

 LookAt 使用できる定数は、XlLookAt クラスの xlWhole または xlPart です。
 SearchOrder 使用できる定数は、XlSearchOrder クラスの xlByRows または xlByColumns です。
 MatchCase 大文字と小文字を区別して検索するには、True を指定します。
 MatchByte この引数は、2 バイト (全角) 文字の言語サポートが選択またはインストールされているときだけ使用できます。半角と全角を区別するには、True を指定します。半角と全角を区別しないようにするには、False を指定します。

 SearchFormat メソッドの検索書式を指定します。
 ReplaceFormat メソッドの置換書式を指定します。

 注意:
 引数 LookIn、LookAt、SearchOrder、MatchCase、および MatchByte の設定は、このメソッドが使われるたびに保存されます。次にこのメソッドを使うときに、これらの引数を省略すると、保存されていた設定が使われます。
 これらの引数の設定を変更すると、[検索と置換] ダイアログ ボックスに表示される設定が変わります。
 また、[検索と置換] ダイアログ ボックスで設定を変更すると、保存されている設定が変わります。
 このような設定の変更によって生じる問題を避けるためには、Find メソッドや Replace メソッドを使うたびに、これらの引数を明示的に指定するようにします。


 Like 演算子は、2 つの文字列の比較をします。

result = string Like pattern

result 必ず指定します。任意の数値変数を指定します。
string 必ず指定します。任意の文字列式を指定します。
pattern 必ず指定します。以下に示すパターン マッチング規則に従った任意の文字列式を指定します。


 文字列式 string と文字列式 pattern が一致していると、演算結果 result は真 (True) になります。
 一致していないときは、演算結果 result は偽 (False) になります。
 文字列式 string または文字列式 pattern のいずれかが Null 値のときは、演算結果 result も Null 値になります。

 Like 演算子の動作は、Option Compare ステートメントの設定によって異なります。
 Option Compare ステートメントは、モジュール内での文字列の比較方法 (Binary モード、Text モード、または Database モード) を指定するものです。
 Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法である Binary モードが使われます。

 Option Compare Binary ステートメントでは、文字列比較で使われる並べ替え順序は、バイナリ文字コードのコード順によって決まります。
 並べ替えのコード順としては、シフト JIS コードが使用されます。
 バイナリ モード (Binary) での並べ替え順序の例を次に示します。
A < B < E < Z < a < b < e < z < A < E < O < a < e < o
* < a < z < あ < ん < ア < ン < 亜 < * < A < ア < ン

 Option Compare Text ステートメントでは、文字列比較は、オペレーティング システムの国別情報によって決まり、日本語の場合は 50 音順およびアルファベット順で、大文字小文字を区別しない並べ替え順序になります。
 清音や濁音は、清音、濁音、半濁音の順序で並べ替えられます。テキスト モード (Text) での並べ替え順序の例を次に示します。
(*=*) < (0=0) < (9=9) < (A=a=A=a) < (B=b=B=b) < (ア=ア=あ) < (ン=ン=ん) < 亜

 組み込みのパターン マッチング機能では、文字列比較のための便利な機能を利用できます。
 事例 ワイルドカードを使った検索 も、参照下さい。
 ワイルドカード、文字リスト、文字範囲などを組み合わせて使用できます。
 次に文字列式 pattern に指定できる文字と、一致する文字を示します。
文字パターン引数 string の中の一致する文字
?任意の 1 文字
*任意の数の文字
#任意の 1 文字の数字 (0-9)
[charlist]文字リスト charlist に指定した文字の中の任意の 1 文字
[!charlist]文字リスト charlist に指定した文字以外の任意の 1 文字

 これらのうち、"#" を除くすべての文字パターンでは、2 バイト文字 (全角文字) も 1 文字と数えて文字列比較を行います。
 "#" には、1 バイト (半角) の数字だけが一致します。
 1 個以上の文字のリスト (charlist) を角かっこ ([ ]) で囲んで文字列式 pattern に指定すると、その中のいずれかの文字と、文字列式 string の中の該当する 1 文字が一致するかどうかを比較することができます。
 角かっこ ([ ]) の中の文字リストには、数字も含め、文字コードおよびシフト JIS コードのほぼすべての文字を指定できます。

 特殊文字の左角かっこ ([)、疑問符 (?)、数値記号 (#)、およびアスタリスク (*) を文字列比較するには、これらの文字を角かっこで囲みます。
 右角かっこ (]) をワイルドカードとしてではなくその文字自体として文字列比較を行うときには、右角かっこを他の文字と共に角かっこで囲んでリストの中に指定することはできません。
 右角かっこは、文字のリストに入れずに単独で指定すると、独立した文字として、文字列の中の文字と比較できます。

 角かっこの中に指定する文字リスト charlist には、文字コードの並びの上限と下限をハイフン (-) で区切ることによって、特定の文字範囲を指定することもできます。
 2 バイト文字も範囲指定でき、漢字の範囲の指定もできます。
 たとえば、[A-Z] と指定すると、大文字の A から Z までの文字をすべてリストの中に指定したときと同じ意味になり、文字列式 string の中の対応する位置の文字が大文字のアルファベットのいずれか 1 文字であるときに一致します。
 1 組の角かっこの中に複数の範囲を指定するときは、それぞれの範囲の間を区切らずに記述します。


 指定した範囲の意味は、Option Compare ステートメントの設定と、実行時のオペレーティング システムの国別情報の設定によって異なります。
 Option Compare Binary ステートメントの例では、[A-E] の範囲を指定すると、A、B および E が一致します。
 Option Compare Text ステートメントでは、[A-E] の範囲を指定すると、A、a、A、a、B、b、E、および e が一致します。この範囲を指定すると、E または e と一致しません。並べ替え順序では、アクセント記号付きの文字はアクセント記号の付いていない文字の後になります。

 文字リスト charlist の先頭に感嘆符 (!) を指定すると、文字列 string の中の文字が文字リスト charlist に指定した文字以外のときに、一致することを表します。
 角かっこの外に指定した感嘆符は、文字としての感嘆符と一致します。

 ハイフン (-) を文字リスト charlist の先頭 (感嘆符が使われているときはその直後) または charlist の末尾に指定したときは、文字としてのハイフンと一致します。
 それ以外の位置に指定したハイフンは、ASCII コードおよびシフト JIS コードの文字の範囲を表します。

 文字の範囲を指定するとき、文字の順序は昇順 (低い方から高い方へ) でなければなりません。
 たとえば、[A-Z] と指定することはできますが、[Z-A] と指定すると文字の範囲は正しく解釈されません。

 角かっこの中に何も指定しないと ([])、長さ 0 の文字列 ("") とみなされます。

 一部の言語には、離れている 2 つの文字を意味する特殊文字がアルファベットに含まれています。
 たとえば、いくつかの言語では、文字 "a" と "e" が共に表示されるときに、文字 "a" を使って表します。
 Like 演算子は、単一の特殊文字と、異なる 2 つの文字が同等であると認識します。

 このような特殊文字を使う言語をオペレーティング システムの国別情報で設定すると、文字列式 pattern または文字列式 string 内の一方の特殊文字は、他方の文字列内の同等な連続する 2 文字と一致します。
 同様に角かっこで囲まれた (角かっこ自体はリスト内または範囲内にある) 文字列式 pattern 内の単一の特殊文字は、文字列式 string 内の同等の連続する 2 文字と一致します。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


セル内改行以降の文字列を除外する

 Excel のセル内改行を区分する文字コードは、vbLf です。
 セルのデータを VBA で取得して、セル内改行以降を除外したいときは、以下のようにします。

   文字列 = データシート.Range("A1").Cells(対象行, 対象列).Value 'セル内改行を含む文字列
   改行までの文字列 = Left(文字列, InStr(文字列, vbLf) - 1)

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


指定フォルダの全てのExcelブックを対象に、検索して置換する

 例えば、会社の組織名が変更になったり、用語が変更になったとき、その文字列を使った全てのExcelブックを、一気に置換したい場合があります。

このExcelをダウンロードできます。→ReplaceAllVBA01.xls

Option Explicit
Option Base 1

   Dim 検索文字列 As String
   Dim 置換文字列 As String
   Dim シート As Worksheet
   Dim ブック名配列(1000, 10) As String
   Dim ブック数 As Integer
   Dim 置換シート数 As Integer
   Dim フォルダパス As String
   
Sub 対象フォルダの全てのExcelで置換()

   Dim Excelバージョン As Integer
   Dim フォルダ As Object
   Dim ファイル As Object
   Dim ファイルシステムオブジェクト As Object
   Dim ファイル名 As String
   
   'Excel のバージョンを取得:バージョンによって異なるコードを書くため
   Excelバージョン = Application.Version
   
   '「検索」「置換」文字列を取得
   ThisWorkbook.Worksheets("スタート").Activate
   検索文字列 = Range("C11").Value
   置換文字列 = Range("C12").Value
   
   If 検索文字列 = "" Then
      MsgBox "検索文字列が指定されていません。終了します。"
      Exit Sub
   End If
   
   Call ファイルを開くダイアログを使って対象フォルダを取得

   'ファイルシステム・オブジェクトを使って、フォルダ、ファイルを操作する
   Set ファイルシステムオブジェクト = CreateObject("Scripting.FileSystemObject")
   Set フォルダ = ファイルシステムオブジェクト.GetFolder(フォルダパス)
   
   '★Excelの存在するフォルダの全てのファイルを対象
   ブック数 = 0
   For Each ファイル In フォルダ.Files
   
      ファイル名 = ファイル.Name
      'このVBAのブック自身は、置換の対象外とする
      If ファイル名 <> ThisWorkbook.Name Then
      
         'ファイルの拡張子を調べて、Excelブックのみを、置換対象とする
         If LCase(Mid(ファイル名, InStrRev(ファイル名, ".") + 1, 3)) = "xls" Then
         
            'ファイルが、置換対象の Excel ブックだったら
            ブック数 = ブック数 + 1
            
            'Excelブックを開く
            Workbooks.Open Filename:=ファイル名
            
            '開いた、作業対象のブックの、全てのワークシートで、文字列を検索して置換
            置換シート数 = 0
            For Each シート In Workbooks(ファイル名).Worksheets
            
               Call データの入力されているセルを検索して置換
               
            Next シート
               
            '処理結果を、配列に書き込む
            ブック名配列(ブック数, 1) = ブック数
            ブック名配列(ブック数, 2) = ファイル名
            ブック名配列(ブック数, 3) = 置換シート数
               
            If 置換シート数 = 0 Then
               '置換対象の文字列が存在しなかったら
               ActiveWorkbook.Close False 'ブックの変更を保存しないで閉じる。
            Else
               'いずれかのシートで、置換をした場合
               
               'Excel 2007〜の場合
               If Excelバージョン > 11 Then
                  '[互換性チェック] ダイアログで、機能を無効にする
                  '[このブックを保存するときに互換性を確認する] を外す
                  ActiveWorkbook.CheckCompatibility = False
               End If
               ActiveWorkbook.Close True 'ブックの変更を保存して閉じる。
            End If
            
         End If '全てのExcelブック
      End If 'このブック以外
   Next ファイル '全てのファイル

   'オブジェクトを解放する
   Set フォルダ = Nothing
   Set ファイルシステムオブジェクト = Nothing
   
   Call テンプレートをコピーしたシートに結果を出力
   
End Sub


Private Sub テンプレートをコピーしたシートに結果を出力()
   Dim 追加シート名初期 As String
   Dim 追加シート名 As String
   Dim 重複 As Integer
   Dim シート数 As Integer
   
   ThisWorkbook.Worksheets("スタート").Activate
   
    追加シート名初期 = "置換結果"
    追加シート名 = 追加シート名初期

    For 重複 = 1 To 100
    ' 100枚まで追加しても重複しないように追番を設定します。
        For Each シート In Worksheets
            If シート.Name = 追加シート名 Then
                追加シート名 = 追加シート名初期 & "(" & 重複 & ")"
            End If
        Next シート
    Next 重複
    シート数 = Worksheets.Count
    Worksheets("テンプレート").Copy After:=Worksheets(シート数)
    ActiveSheet.Name = 追加シート名

   Range("A2").Resize(ブック数, 10) = ブック名配列
   
End Sub


Private Sub データの入力されているセルを検索して置換()
   Dim 見つかったセル As Range
   
   With シート.UsedRange
   
      'Find ステートメントは、Rangeオブジェクトを返すので、Set で代入
      Set 見つかったセル _
         = .Find(what:=検索文字列 _
            , LookIn:=xlValues _
            , LookAt:=xlPart _
            , MatchByte:=False)
      
      If Not 見つかったセル Is Nothing Then
         '検索対象が存在した場合
         置換シート数 = 置換シート数 + 1
         
         .Replace _
            what:=検索文字列 _
         , Replacement:=置換文字列 _
         , LookAt:=xlPart _
         , SearchOrder:=xlByRows _
         , MatchCase:=False _
         , SearchFormat:=False _
         , ReplaceFormat:=False
         
         'シートに置換対象があったら、最初の7シートまで、シート名を配列に登録
         If 置換シート数 > 0 And 置換シート数 < 8 Then
            ブック名配列(ブック数, 置換シート数 + 3) = シート.Name
         End If
         
      End If
      'セル・オブジェクトを解放する
      Set 見つかったセル = Nothing
   End With 'データの登録されているセル
   
End Sub


Private Sub ファイルを開くダイアログを使って対象フォルダを取得()
   Dim Excelブックのパス As String
      
   'ファイルを開くダイアログの、デフォルトのパスを、このブックのパスを使って指定
   ChDrive ThisWorkbook.Path
   ChDir ThisWorkbook.Path

   '[ファイルを開く]ダイアログボックスで、ファイルを指定して、パスを取得
   Excelブックのパス = Application.GetOpenFilename("Excelブック,*.xls*")
   
   '[ファイルを開く]で「キャンセル」した場合は、処理を終了
   If Excelブックのパス = "False" Then End

   'Excelブックのパスから、後ろのファイル名の部分を削除して、フォルダ・パスを取得
   フォルダパス = Left(Excelブックのパス, InStrRev(Excelブックのパス, "\"))

End Sub

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


セルデータの集計と文字検索

 ここでは、「同上の補完」の項で紹介したデータを、Excel の「データ」→「集計」と同じ操作をして集計して、集計行に色をつける事例を紹介します。

 この項は、モーグ即効テクニック集 Excel VBA の下記の項目を参考にさせていただきました。
http://www.moug.net/tech/exvba/0050116.htm
セルデータの集計と文字検索

Sub 集計()
    Dim シート数 As Integer
    Dim シート名 As String
    Dim 対象セル範囲 As Range  ' 一覧のセル範囲

    ' 処理を高速化するため、画面描画停止、自動計算停止
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    '生徒数集計という名前のシートを追加してデータをコピーします。
    シート数 = ThisWorkbook.Sheets.Count
    シート名 = "生徒数集計"
    ThisWorkbook.Worksheets("生徒数").Copy After:=Sheets(シート数)
    ActiveSheet.Name = シート名

    ' Withステートメントで、ワークシートの指定を省略
    With Worksheets("生徒数集計")
        ' A1セル起点で表全体を選択して、集計を行なう。
        Range("A1").Select
        Set 対象セル範囲 = ActiveCell.CurrentRegion
        With 対象セル範囲
            ' 集計処理を学年とクラスの2回行なう。
            .Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4), _
                Replace:=True, PageBreaks:=False, SummaryBelowData:=True
            .Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(4), _
                Replace:=False, PageBreaks:=False, SummaryBelowData:=True
        End With
        .Calculate ' 再計算
    End With


    Dim 検索セル As Range
    Dim 合致セル As String
    Dim 合致行 As Integer

    For i = 1 To 2
    'シートの1列目と2列目を対象に検索
    With Worksheets("生徒数集計").UsedRange.Columns(i)  
        Set 検索セル = .Find("計")       '---検索セルに検索結果を格納
        If Not 検索セル Is Nothing Then    '---条件に当てはまるセルがあれば
           合致セル = 検索セル.Address   '---最初のセルのアドレスを覚える
           Do
               Set 検索セル = .FindNext(検索セル)
                '---今見つけたセルから次のセルを検索
                合致行 = 検索セル.Rows.Row
                Rows(合致行).Select
                If i = 2 Then
                    With Selection.Interior
                        .ColorIndex = 36
                        .Pattern = xlSolid
                    End With
                Else
                    With Selection.Interior
                        .ColorIndex = 34
                        .Pattern = xlSolid
                    End With
                End If
           Loop While Not 検索セル Is Nothing _
           And 検索セル.Address <> 合致セル  '----条件に当てはまる全てを検索
         End If
    End With
    Set 検索セル = Nothing
    Next i
    Range("B2").Select
    
    ' 画面描画再開、自動計算停止解除
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

 解説:
 ScreenUpdating プロパティは、False の場合、マクロの実行中に画面表示を更新しません。マクロの速度を向上させるため、画面を更新しないようにします。この場合、マクロの処理過程は見ることができませんが、実行速度が速くなります。
 マクロが終了した後は、ScreenUpdating プロパティの値を True に戻します。

注意1:マクロの実行途中で、ScreenUpdating プロパティが、False の状態で停止すると、ウインドウの操作ができなくなります。
そのため、デバッグを充分した後、マクロが完動することを確認した後で、このコードを有効にするようにします。


注意2:画面を更新しない状態だと、パソコンが砂時計のままで、マクロが動いているかどうか分からず、不安になることがあります。
こんなとき、ステータス バーに進捗を表示して、状況を分かりやすくすることができます。


 Calculation プロパティApplication オブジェクトに指定した場合は、計算方法のモードを設定します。値の取得および設定が可能です。XlCalculation クラスの定数を使用します。
使用できる定数は、次に示す XlCalculation クラスのいずれかです。
 Range オブジェクトの Subtotal メソッドは、セル範囲の集計を作成します。指定されたセル範囲が単一セルのときは、アクティブ セル領域を集計します。

 expression.Subtotal(GroupBy, Function, TotalList, Replace, PageBreaks, SummaryBelowData)

 expression 必ず指定します。対象となる Range オブジェクトを返すオブジェクト式を指定します。

 GroupBy 必ず指定します。長整数型 (Long) の値を使用します。グループ化の基準となるフィールドの番号を、1 から始まる整数で指定します。使用例を参照してください。

 Function 必ず指定します。XlConsolidationFunction クラスの定数を使用します。集計関数を指定します。
 使用できる定数は、次に示す XlConsilidationFunction クラスの定数のいずれかです。
  • xlAverage
  • xlCount
  • xlCountNums
  • xlMax
  • xlMin
  • xlProduct
  • xlStDev
  • xlStDevP
  • xlSum
  • xlUnknown
  • xlVar
  • xlVarP
 TotalList 必ず指定します。バリアント型 (Variant) の値を使用します。集計するフィールドを番号で指定します。フィールドの番号は、[集計するフィールド] リスト ボックスに表示される順で、1 から始まる整数です。複数指定する場合は、カンマ (,) で区切ります。使用例を参照してください。

 Replace 既存の集計表と置き換えるには、True を指定します。既定値は False です。

 PageBreaks グループごとに改ページが挿入されるようにするには、True を指定します。既定値は False です。

 SummaryBelowData XlSummaryRow クラスの定数を使用します。集計結果の配置を、集計表との相対で指定します。
 使用できる定数は、次に示す XlSummaryRow クラスの定数のいずれかです。

 Calculate メソッドは、計算を実行します。計算の対象となるのは、開かれているすべてのブック、ブック内の特定のワークシート、ワークシート内の指定されたセル範囲のいずれかです。

expression.Calculate

expression は、 Application オブジェクトでは省略可能です。Worksheet オブジェクトおよび Range オブジェクトでは必ず指定します。対象となるオブジェクトへの参照を返すオブジェクト式を指定します。

 Nothing キーワードは、オブジェクト変数とその変数が参照しているオブジェクトとの関連付けを解除するために使います。
 プロパティで Nothing とは、該当するオブジェクトが、存在しないことを意味します。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


並び替え+重複行削除

 重複行削除@は、AdvancedFilter メソッドを使って、重複行を削除しています。制約条件は、トップにタイトル行が必要な点です。
 重複行削除Aの方は、Offset を使って行比較しているので、データのみの場合にも使えます。
 並び替え重複行削除Bは、VBAのヘルプに書いてあるコードです。やはり一番すっきりしていますね。(^^ゞ

 並び替えについては、データを並び替え も参照下さい。


Option Explicit

Sub Flow()
    Call 並び替え
    Call 重複行削除@
End Sub

Private Sub 並び替え()
    ThisWorkbook.Worksheets("Sheet1").Activate
    Range("A1").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Sort _
        Key1:=Range("A1"), _
        Order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlPinYin
    ThisWorkbook.Worksheets("Sheet1").Range("A1").Select
End Sub

Private Sub 重複行削除@()
    ThisWorkbook.Worksheets("Sheet1").Activate
    ActiveCell.CurrentRegion.AdvancedFilter _
    Action:=xlFilterCopy, _
    CopyToRange:=Sheets("Sheet2").Range("A1"), _
    unique:=True '重複するレコードを無視
    ThisWorkbook.Worksheets("Sheet2").Activate
    Range("A1").Select
End Sub



Sub 重複行削除A()
    ThisWorkbook.Worksheets("Sheet1").Activate
    Dim i As Integer
    With Range("A2")
        Do While .Offset(i, 0) <> ""
            If .Offset(i, 0) = .Offset(i - 1, 0) Then
            .Offset(i, 0).EntireRow.Delete
            Else
            i = i + 1
            End If
        Loop
    End With
End Sub

 下のExcelをダウンロードできます。→DeleteRepetitiousLines.xls


Option Explicit

Sub 重複行を削除()

    Dim 対象ブック As String
    Dim 指定セル As Range
    Dim 名前 As String
    Dim アドレス As String
    Dim シート As String
    
    ' 処理対象シートを選択して、列名とシート名を取得

    On Error GoTo キャンセル
    Set 指定セル = Application.InputBox _
        (prompt:="処理するBookの、シートの対象列の、適当なセルを選択してください" _
        , Title:="処理対象列の指定" _
        , Type:=8)  ' 8は、セル参照 (Range オブジェクト)

    ' 事例では、このマクロは、「DeleteRepetitiousLines.xls」というファイル名。
    ' 指定セルの Range に対して、.Parent で親オブジェクトWorksheets を、
    ' その.Parent で、Workbooks を、取得します。

    対象ブック = 指定セル.Parent.Parent.Name
    If 対象ブック = "DeleteRepetitiousLines.xls" Then
        MsgBox "指定されたファイルは、このマクロのファイル自身です。" _
        & Chr(13) & "このままマクロを終了します。"
        End
    End If
    
    アドレス = 指定セル.Address(ColumnAbsolute:=False)
    アドレス = Left(アドレス, InStr(アドレス, "$") - 1)
    シート = 指定セル.Parent.Name
    
    Call 並び替え重複行削除B(対象ブック, シート, アドレス)

キャンセル:

End Sub


Private Sub 並び替え重複行削除B(ブック名 As String, シート名 As String, 列名 As String)
    Dim 列セル名 As String
    Dim 処理中セル As Range
    Dim 次のセル As Range
    
    Workbooks(ブック名).Worksheets(シート名).Activate
    Application.ScreenUpdating = False

    列セル名 = 列名 & "1"
    
    Worksheets(シート名).Range(列セル名).Sort _
        Key1:=Worksheets(シート名).Range(列セル名)

    Set 処理中セル = Worksheets(シート名).Range(列セル名)
    Do While Not IsEmpty(処理中セル)
        Set 次のセル = 処理中セル.Offset(1, 0)
        If 次のセル.Value = 処理中セル.Value Then
            処理中セル.EntireRow.Delete
        End If
        Set 処理中セル = 次のセル
    Loop
    
    Application.ScreenUpdating = True
    Range("A1").Select

End Sub

 解説:
 Sort メソッドの引数と意味は、以下のとおりです。

 注意:標準モジュールに、Sort メソッドのコードを書いて実行する場合は、並べ替えを行う対象のワークシートが、アクティブになっていないと、エラーになります。


expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

 expression は、必ず指定します。対象となるオブジェクトへの参照を返すオブジェクト式を指定します。

 Key1 は、最初の並べ替えフィールドを、テキスト (ピボットテーブル フィールドまたは範囲名) または Range オブジェクト (たとえば、"Dept" または Cells(1, 1)) で指定します。バリアント型 (Variant) の値を使用します。省略可能です。

 Order1 は、Key1 で指定したフィールドまたは範囲の並べ替え順を指定します。使用できる定数は、次に示す XlSortOrder クラスの定数のいずれかです。xlDescending Key1 を降順で並べ替えます。xlAscending 既定値。Key1 を昇順で並べ替えます。省略可能です。

 Key2Key3 は、2 番目、3 番目の並べ替えフィールドを、テキスト (範囲名) または Range オブジェクトで指定します。この引数を省略した場合、2 番目、3 番目の並べ替えフィールドはありません。ピボットテーブル レポートの並べ替えには使用できません。省略可能です。バリアント型 (Variant) の値を使用します。
 Type は、ピボットテーブル レポートを並べ替えるときにのみ使用します。 使用できる定数は、次に示す XlSortType クラスの定数のいずれかです。 xlSortLabels ピボットテーブル レポートをラベルで並べ替えます。 xlSortValues ピボットテーブル レポートを値で並べ替えます。省略可能です。
 Order2Order3 は、Key2、Key3 で指定したフィールドまたは範囲の並べ替え順を指定します。使用できる定数は、次に示す XlSortOrder クラスの定数のいずれかです。xlDescending Key2、Key3 を降順で並べ替えます。 xlAscending 既定値。Key2、Key3 を昇順で並べ替えます。省略可能です。ピボットテーブル レポートの並べ替えには使用できません。

 Header は、先頭の行が見出しかどうかを指定します。使用できる定数は、次に示す XlYesNoGuess クラスの定数のいずれかです。
xlGuess Excel に見出しがあるかどうかを調べさせ、ある場合はその場所を調べさせます。
xlNo 既定値。範囲全体が並べ替えの対象です。
xlYes 先頭行(見出し)は並べ替えられません。省略可能です。ピボットテーブル レポートの並べ替えには使用できません。

 OrderCustom は、ユーザー設定の並べ替え順のリスト内の番号を示す、1 から始まる整数です。OrderCustom を省略すると、通常の並べ替え順が使用されます。省略可能です。バリアント型 (Variant) の値を使用します。
 MatchCase は、True の場合、大文字と小文字を区別して並べ替えを行います。False の場合、大文字と小文字を区別しないで並べ替えを行います。省略可能です。バリアント型 (Variant) の値を使用します。ピボットテーブル レポートの並べ替えには使用できません。
 Orientation は、並べ替えの方向を指定します。使用できる定数は、次に示す XlSortOrientation クラスの定数のいずれかです。xlSortRows 既定値。行単位で並べ替えます。 xlSortColumns 列単位で並べ替えます。省略可能です。
 SortMethod は、並べ替えの種類を指定します。選択またはインストールされている言語の設定 (たとえば、日本語) によって、これらのいくつかの定数が使用できない場合があります。省略可能です。使用できる定数は、次に示す XlSortMethod クラスの定数のいずれかです。 xlStroke 各文字の総画数で並べ替えます。 xlPinYin 既定値。中国語の発音表記の順で並べ替えます。
 DataOption1DataOption3 は、1 番目〜3 番目のキーのテキストを並べ替える方法を指定します。省略可能です。使用できる定数は、次に示す XlSortDataOption クラスの定数のいずれかです。 xlSortTextAsNumbers テキストを数値データとして並べ替えます。 xlSortNormal 既定値。数値データとテキスト データを別々に並べ替えます。 ピボットテーブル レポートの並べ替えには使用できません。

 注:Sort の DataOption1DataOption3 の3つのオプションは、Excel2002以前のバージョンではエラーになるので、使わないようにします。

 二つのキーで、並び替える場合、下記の例のように、最小限のコードで、ソートできます。
   Range("A1").CurrentRegion.Sort _
      Key1:=Range("P2"), Order1:=xlAscending, _
      Key2:=Range("B2"), Order2:=xlAscending, _
      Header:=xlYes

 タイトル行が、複数行(下の例は、2行)の場合は、データ部分だけを範囲指定して、ソートします。
 下のコードの例は、
タイトル行が、1行目と2行目の 2行で、
3行目の1列目から、集計シート最終行、集計シート最終列までの範囲を、
ABCDFの 5つのキーで昇順に並べるものです。
   '頭2行は、タイトル行なので、3行目以降をソート対象とする
   'ソート・キーは、最大3つなので、2回に分けてソートする
   集計シート.Activate
   集計シート.Range(Cells(3, 1), Cells(集計シート最終行, 集計シート最終列)).Sort _
      Key1:=Range("D2"), Order1:=xlAscending, _
      Key2:=Range("F2"), Order2:=xlAscending, _
      Header:=xlNo

   集計シート.Range(Cells(3, 1), Cells(集計シート最終行, 集計シート最終列)).Sort _
      Key1:=Range("A2"), Order1:=xlAscending, _
      Key2:=Range("B2"), Order2:=xlAscending, _
      Key3:=Range("C2"), Order3:=xlAscending, _
      Header:=xlNo


 expression.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)メソッドは、関連項目対象使用例アプリケーション情報検索条件範囲に基づいて、リストにフィルタをかけます。抽出結果は、選択範囲内に表示するか、ほかの範囲にデータをコピーするかを選択できます。

 Action を xlFilterCopy に設定したときは、CopyToRange で、抽出された行のコピー先のセル範囲を指定します。
 Unique を、True に設定すると、検索条件に一致するレコードのうち、重複するレコードは無視されます。既定値は False (重複するレコードも含めて、検索条件に一致するレコードをすべて抽出)です。


 expression.Offset(RowOffset, ColumnOffset)プロパティは、指定した範囲からのオフセットの範囲 (Range オブジェクト) を返します。値の取得のみ可能です。

 RowOffset は、オフセットする範囲の行数 (正、負、または 0) を指定します。正の値は下方向、負の値は上方向のオフセットを表します。既定値は 0 です。
 ColumnOffsetは、オフセットする範囲の列数 (正、負、または 0) です。


 Delete メソッドは、指定したオブジェクトを削除します。

 Delete メソッドを Range オブジェクトに指定した場合
expression.Delete(Shift)

expression 必ず指定します。Range オブジェクトを返すオブジェクト式を指定します。
Shift 省略可能です。バリアント型 (Variant) の値を使用します。セルを削除した後でセルをどのようにシフトするかを指定します。使用できる定数は、XlDeleteShiftDirection クラスの xlShiftToLeft または xlShiftUp です。この引数を省略すると、セル範囲の形に適応した方向にシフトされます。

 開始行番号と終了行番号を指定して、行削除するときは、下記のようにします。
Rows(開始行番号 & ":" & 終了行番号).Delete Shift:=xlUp

 開始セル名と終了行番号を指定して、セル範囲を削除するときは、下記のようにします。
Range("A6:C" & CStr(最終行)).Delete Shift:=xlUp

 Delete メソッドを ListColumn オブジェクトに指定した場合
 リスト内の列のデータを削除します。シートから列を削除しません。
 リストが Microsoft Windows SharePoint Services サイトにリンクされている場合、その列をサーバーから削除できず、エラーが生成されます。
expression.Delete()

expression 必ず指定します。ListColumn オブジェクトを返すオブジェクト式を指定します。

 Delete メソッドを ListRow オブジェクトに指定した場合
 リストの行のセルを削除し、削除した行以下のセルを上方向にシフトします。
 リストが SharePoint サイトにリンクされていても、リスト内の行を削除できます。ただし、変更を同期させるまでは、SharePoint サイトのリストは更新されません。
expression.Delete()

expression 必ず指定します。ListRow オブジェクトを返すオブジェクト式を指定します。

 Delete メソッドを、図形オブジェクトに指定した場合、オブジェクトを削除します。

expression.Delete

expression   必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。


DisplayAlerts プロパティ
 ブックまたはワークシートを削除するときには、ブックまたはワークシートを削除してもよいかを確認するダイアログ ボックスが表示されます。
 このダイアログ ボックスは既定で表示されます。これらのオブジェクトに対してこのメソッドを呼び出すときは、ダイアログ ボックスで、ユーザーが [キャンセル] をクリックすると False のブール値が返され、[削除] をクリックすると True のブール値が返されます。

 次の例は、確認のダイアログ ボックスを表示しないで、作業中のブックのシート 3 を削除します。
Application.DisplayAlerts = False
Worksheets("Sheet3").Delete
Application.DisplayAlerts = True

次の使用例は、ワークシートの指定した列のデータを並べ替え、重複するデータを含む行を削除します。
Sub DeleteColumnDupes(strSheetName As String, strColumnLetter As String)
    Dim strColumnRange As String
    Dim rngCurrentCell As Range
    Dim rngNextCell As Range
    
    strColumnRange = strColumnLetter & "1"
    
    Worksheets(strSheetName).Range(strColumnRange).Sort _
        Key1:=Worksheets(strSheetName).Range(strColumnRange)
    Set rngCurrentCell = Worksheets(strSheetName).Range(strColumnRange)
    Do While Not IsEmpty(rngCurrentCell)
        Set rngNextCell = rngCurrentCell.Offset(1, 0)
        If rngNextCell.Value = rngCurrentCell.Value Then
            rngCurrentCell.EntireRow.Delete
        End If
        Set rngCurrentCell = rngNextCell
    Loop
End Sub

この種類の目次に戻る↑ 索引へ↓ トップページに戻る

使っている全てのセルを指定する

せい   
アベ阿部
223-
アリモト有本
611-
イワタ岩田
453-
ウチダ内田
214-
ウノ宇野
285-
オオニシ大西
571-
オダ小田
194-

 ソートする範囲を指定するとき、その範囲に、右の例のように、空白行や空白列が含まれるとき、漏れなく指定するには、UsedRange を使います。

 この方法は、よねさんのWordとExcelの小部屋で教えていただきました。
Excel(エクセル) VBA入門:セル範囲の指定方法
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html

 空白行と空白列で囲まれたアクティブ セル領域を選択する場合は、CurrentRegion プロパティを使います。

Sub Macro()
    Worksheets("Sheet1").UsedRange.Sort Key1:=Range("D1"), Order1:=xlAscending, _
    Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlPinYin, DataOption1:=xlSortNormal
End Sub

 UsedRange プロパティは、オブジェクトを返すプロパティです。指定されたワークシートで使われたセル範囲 (Range オブジェクト) を返します。値の取得のみ可能です。

この種類の目次に戻る↑ この種類の続きを見る↓ 索引へ↓ トップページに戻る

ホームページのトップに戻る