VBA備忘録

VBAソースの備忘録。当面Excelのみ。

セル書式を書き出す

この表の各セルの書式を赤い罫線内に書き出す

A列:文字列(A4のみ標準)、B列:数値、C列:通貨

1行目はタイトルなので値をコピー

 

 

    Dim lngMaxRow As Long
    Dim lngMaxCol As Long
    
    Dim i As Integer
    Dim j As Integer

    '表内最大行を取得
    lngMaxRow = lngGetMaxRow(ActiveSheet)
    
    '表内最大列を取得
    lngMaxCol = lngGetMaxCol(ActiveSheet)
    
    
    For i = 1 To lngMaxRow  '最大行まで繰り返す
    
        For j = 1 To lngMaxCol  '最大列まで繰り返す
        
            If i = 1 Then
                '1行目はタイトルなので値をコピー
                ActiveSheet.Cells(i, j + 5).Value = ActiveSheet.Cells(i, j).Value
            Else
                '2行目以降は1セルずつ書式を記述する(5列先)
                Call WriteRangeFormat(ActiveSheet.Cells(i, j), ActiveSheet.Cells(i, j + 5))
            End If
            
        Next j
        
    Next i

【呼び出し関数】

'------------------------------------------------------
'セルの書式設定を書き出す
'
'   戻値:なし
'
'   引数:コピー元セル(範囲指定は不可)
'       :コピー先セル(範囲指定可)
'
'   注意:コピー元セルが複数指定されている場合エラーとする
'-------------------------------------------------------
Sub WriteRangeFormat(rngMoto As Range, rngSaki As Range)
    
    If rngMoto.Count > 1 Then
    
        'エラー処理を行う(ログを出す、セルを色づけする等)
        
        Exit Sub
        
    End If
    
    rngSaki.Value = rngMoto.NumberFormatLocal
    
End Sub

 

【結果】

 

For Nextを使って表をコピー

この表を赤い罫線内にコピーする

    Dim lngMaxRow As Long
    Dim lngMaxCol As Long
    
    Dim i As Integer
    Dim j As Integer

 

    '表内最大行を取得
    lngMaxRow = lngGetMaxRow(ActiveSheet)
    
    '表内最大列を取得
    lngMaxCol = lngGetMaxCol(ActiveSheet)
    
    
    For i = 1 To lngMaxRow  '最大行まで繰り返す
    
        For j = 1 To lngMaxCol  '最大列まで繰り返す
        
            '5列先に1セルずつコピーする
            ActiveSheet.Cells(i, j + 5).Value = ActiveSheet.Cells(i, j).Value
            
        Next j
        
    Next i

 

【結果】

 

セルの書式をコピー&ペースト

'------------------------------------------------------
'セルの書式設定をコピー
'
'   戻値:なし
'
'   引数:コピー元セル(範囲指定は不可)
'       :コピー先セル(範囲指定可)
'
'   注意:コピー元セルが複数指定されている場合エラーとする
'-------------------------------------------------------
Sub CopyRangeFormat(rngMoto As Range, rngSaki As Range)
    
    If rngMoto.Count > 1 Then
    
        'エラー処理を行う(ログを出す、セルを色づけする等)
        
        Exit Sub
        
    End If
    
    rngSaki.NumberFormatLocal = rngMoto.NumberFormatLocal
    
End Sub

 

呼び出し方

    'A1の書式設定をB1にコピー
    Call CopyRangeFormat(Range("A1"), Range("B1"))
        
    'A1セルの書式設定を複数セルにコピー
    Call CopyRangeFormat(Range("A1"), Range("B1:B10"))

表内最終列を取得

'------------------------------------------------------
'表内最大列を取得
'
'   戻値:表内最大列
'
'   引数:対象ワークシート
'       :カウント基準となる行(省略時:1(1行目))
'
'   注意:オートフィルター、非表示は解除してから行うこと
'-------------------------------------------------------
Function lngGetMaxCol(wsWorksheet As Worksheet, Optional lngCountBaseRow As Long = 1) As Long

    Dim lngMaxCol As Long
    
    lngMaxCol = wsWorksheet.Cells(lngCountBaseRow, Columns.Count).End(xlToLeft).Column    'シート最大列からCtrl+←で表内最大列取得
    
    lngGetMaxCol = lngMaxCol
    
End Function

表内最終行を取得

'------------------------------------------------------
'表内最終行を取得
'
'   戻値:表内最終行
'
'   引数:対象ワークシート
'       :カウント基準となる列(省略時:1(A列))
'
'   注意:オートフィルター、非表示は解除してから行うこと
'-------------------------------------------------------
Function lngGetMaxRow(wsWorksheet As Worksheet, Optional lngCountBaseCol As Long = 1) As Long

    Dim lngMaxRow As Long
    
    lngMaxRow = wsWorksheet.Cells(Rows.Count, lngCountBaseCol).End(xlUp).Row    'シート最大行からCtrl+↑で表内最大行取得
    
    lngGetMaxRow = lngMaxRow
    
End Function

 

マクロを組むとき まずどうするか④ 関数をボタンに紐付ける

【開発】タブ⇒【挿入】⇒フォームコントロールの【ボタン】を選択

マウスをドラックし、任意の場所にボタンを作成

マクロ選択画面が自動で表示されるので、先ほどの「GetValue」関数を選択

【OK】を押下する

ボタンが作成されているので、押下。「GetValue」関数が実行される

 

既存のボタンに関数を登録する場合は、

【ボタン】(右クリック)⇒【マクロの登録】

マクロの登録画面が表示されるので。関数を選択⇒【OK】

 

マクロを組むとき まずどうするか③ 関数を呼ぶ

Excel ワークシートに戻る

(A1セルに「Test Message」と値が入っている)

【マクロ】を選択

マクロの一覧が表示され、先ほど作成した「GetValue」が確認できる。

「実行」ボタンを押下すると、

A1の値を表示するメッセージボックスが表示される