VBAのノウハウ|開発時のコピーペースト用ページ | ムノログ 合同会社ムジンケイカクプロのITノウハウブログ
VBAツール

VBAのノウハウ|開発時のコピーペースト用ページ

業務改善 VBAツール

個人的に、上から順によく使うものと忘れやすいものになっています。
自分用の備忘録です。

配列の初期化のパターン

Dim arr() As Variant
Dim arr1(1) As Long
Dim arr2(2) As String

'配列初期化
Erase arr

0が入るか空っぽになるかの差。

変数定義

Option Explicit
Public str1 As String, str2 As String
Dim result '変数のみでVariant型に
Dim result_str As String '文字列型
Dim num1 As Integer '数値今はあまり意味がないらしい
Dim num2 As Long '数値 実質はLongとして内部処理されているらしい
Dim objAs Object
Dim ws As Worksheet
Dim item As Variant

最大行と最大列の取得

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column

Set ws = Worksheets("TOP")

With ws

MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column

End With

文字列を指定文字で分割するSplit

公的機関が配布しているデータの中にも、よくSplitしなければならないデータがあります。
指定文字数での分割もあるかと思います。

Sub test()

str1 = "test1,test2,test3"
split_str = Split(str1, ",")

End Sub

文字列を指定文字で分割したあとの配列のループと配列の初期化

''配列を分割したあとにループで前後に文字を追加する
'strにカンマが複数ある場合、カンマで区切る

split_str = Split(str, ",")

For Each item In split_str

split_str_replace = split_str_replace & "分割後の文字列は" & StrConv(item, vbWide) & "です"

Next item

Erase split_str '配列の初期化
Erase split_str_replace '配列の初期化

▼「Redimが無効です」と出る例

分割後に半角数字を全角へ変換もしています。

Sub test1()

str1 = "test1,test2,test3"
'strにカンマが複数ある場合、カンマで区切る
split_str = Split(str1, ",")


For Each item In split_str

split_str_replace = split_str_replace & "分割後の文字列は" & StrConv(item, vbWide) & "です,"

Next item

Erase split_str  '配列の初期化

arr = Split(split_str_replace, ",")

'配列の最後の要素を削除
ReDim Preserve arr(UBound(arr) - 1)

Erase split_str_replace  '配列の初期化

End Sub

Variant には配列を含むことができますが、明示的に宣言されていない場合は、ReDim を使用して配列に変更できません。

無効な ReDim です | Microsoft Docs

▼「Redimが無効です」と出た場合の修正

配列の宣言を入れただけの修正。

Sub test2()

Dim arr

str1 = "test1,test2,test3"
'strにカンマが複数ある場合、カンマで区切る
split_str = Split(str1, ",")


For Each item In split_str

split_str_replace = split_str_replace & "分割後の文字列は" & StrConv(item, vbWide) & "です,"

Next item

Erase split_str  '配列の初期化

arr = Split(split_str_replace, ",")

'配列の最後の要素を削除
ReDim Preserve arr(UBound(arr) - 1)

Erase arr  '配列の初期化

End Sub

文字列を指定文字で分割したあと、配列のループで配列内に処理した文字列を再度格納する

vbaでforでループさせ、uboundで配列要素数分を取得しループ処理します。
配列の最初である0からカウントアップして、任意処理した文字列を戻します。

Sub test3()

str1 = "test1,test2,test3"
'strにカンマが複数ある場合、カンマで区切る
split_str = Split(str1, ",")

For i = 0 To UBound(split_str)
    split_str(i) = "分割後の文字列は" & StrConv(split_str(i), vbWide) & "です"
Next

End Sub

SmartArtの取り扱い

Call ActiveSheet.Shapes.AddSmartArt(Application.SmartArtLayouts( _
    "urn:microsoft.com/office/officeart/2005/8/layout/hierarchy2"))
        
Set oShape = ActiveSheet.Shapes(1)
For i = 1 To oShape.SmartArt.AllNodes.Count
  oShape.SmartArt.AllNodes(i).TextFrame2.TextRange.Text = "Sample " & Cells(i, 1)
Next

oShape.SmartArt.Nodes.Add

SmartArt.Nodes.Addをループ処理した場合、ノード追加で自動的に3つ毎に繰り下がって増えていく状況を目視確認。
デフォルトのノードの増え方は、グラフの形状にもよると判断している。

参考

限定的に役立つVBA

【VBA】【没コード集】VBAで、文字列に誘導員という文字があるセルを、最下部の行から調べていき、見つけたら変数に格納して、見つけた行以外の、59列目と60列目に転記する場合。