VBAのメモ書き1(本を基礎で読み返して&少し記述)

メモ。覚書き。

VBA内でワークシート関数を使うときは
WorkSheetFunctionオブジェクトを使用する。

たとえば
WorkSheetFunction.SUM(A1:B5)とか。

以下のようなものを本で実際やってみたので残してみる。

Sub 請求書作成(kokyaku As String) '引数は請求書を作成する顧客名
    
    Const HAN_HIDUKE_CLM As Integer = 1 '日付の列(販売ワークシート)
    Const HAN_KOKYAKU_CLM As Integer = 2 '顧客の列(販売ワークシート)
    Const HAN_SYOHIN_CLM As Integer = 3 ' 商品の列(販売ワークシート)
    Const HAN_TANKA_CLM As Integer = 4 '単価の列(販売ワークシート)
    Const HAN_SURYO_CLM As Integer = 5 '数量の列(販売ワークシート)
    Const HAN_KINGAKU_CLM As Integer = 6 '金額の列(販売ワークシート)
    Const HAN_MIDASHI As Integer = 1 '見出しの列数(販売ワークシート)
    
    Dim i As Integer    '販売シート用カウンタ変数
    Dim cnt As Integer  '請求書ワークシート処理用のカウンタ変数
    Dim hanKiten As Range '販売ワークシートの表の基点セル
    Dim seiKiten As Range '請求書ワークシートの表の基点セル
    
    cnt = 1    'cntの初期化
    
    'ワークシート請求書雛形をコピー。新規請求書作成。
    Worksheets("請求書雛形").Copy after:=Worksheets(Worksheets.Count)   '請求書雛形ワークシートを末尾にコピー作成
    Worksheets(Worksheets.Count).Name = kokyaku     '新規コピー先のワークシート名を設定
    Worksheets(kokyaku).Range("A6").Value = kokyaku '請求書の宛先を設定
    Worksheets(kokyaku).Range("E2").Value = Date    '請求日を設定
    
    Set hanKiten = Worksheets("販売").Range("A4") 'hankitenの初期化
    Set seiKiten = Worksheets(kokyaku).Range("A12") '請求書のワークシートの表の基点セルの初期化
    
    '指定した顧客の販売データを請求書へコピー
    
    For i = 1 To hanKiten.CurrentRegion.Rows.Count - HAN_MIDASHI
        If hanKiten.Cells(i, HAN_KOKYAKU_CLM).Value = kokyaku Then
            seiKiten.Cells(cnt, 1).Value = _
                                    hanKiten.Cells(i, HAN_HIDUKE_CLM).Value   '日付
            seiKiten.Cells(cnt, 2).Value = _
                                    hanKiten.Cells(i, HAN_SYOHIN_CLM).Value   '商品
            seiKiten.Cells(cnt, 3).Value = _
                                    hanKiten.Cells(i, HAN_TANKA_CLM).Value   '単価
            seiKiten.Cells(cnt, 4).Value = _
                                    hanKiten.Cells(i, HAN_SURYO_CLM).Value   '数量
            seiKiten.Cells(cnt, 5).Value = _
                                    hanKiten.Cells(i, HAN_KINGAKU_CLM).Value   '金額
            cnt = cnt + 1
        End If
    Next i
End Sub

Sub フォーム用意()
    myForm.Show
End Sub

読んだのはこの本。

ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本

ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本


あとなんとなくサンプルとして少し書いてみたの

Sub 店舗出力()

Dim i As Integer 'セルのループ用
Dim bCodeRetu As Range '店舗コード列
Dim tempocode As Integer '探す店舗コード

Set bCodeRetu = Range("A1") '店舗コード列の指定
tempocode = 1

For i = 1 To bCodeRetu.CurrentRegion.Rows.Count
    If Cells(i, "A").Value = tempocode Then
        Cells(bCodeRetu.CurrentRegion.Rows.Count + 1, "A").Value = Cells(i, "A").Value
        Cells(bCodeRetu.CurrentRegion.Rows.Count, "B").Value = Cells(i, "B").Value
        Exit For
    End If
Next i
End Sub

Sub 区分行追加()
    
Dim kCodeRetu As Range '科目コード列
Dim kubun1 As String '区分
Dim kubun2 As String '区分

kubun1 = "売上1"
kubun2 = "売上2"

Range("A:A").Insert '左端に列を挿入

Range("A1").Value = "区分"
For i = 2 To Range("A1").CurrentRegion.Rows.Count
    If Cells(i, "D").Value = 1 Or Cells(i, "D").Value = 2 Then
        Cells(i, "A").Value = kubun1
    Else
        Cells(i, "A").Value = kubun2
    End If
Next i

End Sub

こんだけの分だと非常に乏しくてワークシートの方が俄然早い。。。
ワークシート関数で処理書いて処理させているけど、
参照元をたどっていくとややこしくなるのと、
書き方汚いせいで、ずれるたりすると他のデータもまとめて
どんどん計算ずれたりして直したりするのに時間を取られてしまう。。