Sub CStr6()
MsgBox "今は" + CStr(Now()) + "です"
End Sub
Now()をCStrに設定しています。
エラーが発生することなく表示されました。
大体の方はCStrで書かず&でコードを書くと思います。
Sub CStr7()
MsgBox "今は" & Now() & "です"
End Sub
セルから値を取得してString型の配列に格納
上記の内容は文字列、日付、数値のデータがあります。
こちらを文字列に変換して配列に格納していきます。
Sub CStr8()
Dim neko(3) As String
Dim i As Integer
i = 0
Do While Cells(2, i + 2) <> ""
neko(i) = CStr(Cells(2, i + 2))
i = i + 1
Loop
Cells(2, i + 2) = Join(neko)
End Sub
Sub Split2()
MsgBox Join(Split("aaa bbb ccc"), vbLf)
End Sub
この様な記載も可能です。
Split関数内に文字列が無い場合
Sub Split3()
Dim str() As String
str = Split("")
MsgBox Join(str, vbLf)
End Sub
Split関数内に文字列がないので何も表示されません。
Split関数内に区切りたい文字列を設定
Sub Split4()
Dim str() As String
str = Split("aaa bbb_ccc", "_")
MsgBox Join(str, vbLf)
End Sub
Split関数内で区切り文字を”_”で設定します。
Split関数内の文字列にbとcの間に”_”があるので、分割して配列に格納されました。
区切り文字が”_”のため” “は判断されません。
Split関数内に返す要素数を設定
Sub Split5()
Dim str() As String
str = Split("aaa_bbb_ccc", "_", 2)
MsgBox Join(str, vbLf)
End Sub
Split関数内で”_”が文字列の中に2つあります。
返す要素数を2に設定しています。
配列の要素数を2で設定したので、1つ目の”_”で区切られ配列に格納されました。
ちなみに返す要素数を-1にするとすべて返します。
区切り文字を省略した場合は” “で判定されます。
Sub Split6()
Dim str() As String
str = Split("aaa bbb ccc", , 2)
MsgBox Join(str, vbLf)
End Sub
Split関数内に区切り文字の比較方法を設定
比較方法ですが、大文字小文字を比較するしないの設定が出来ます。
0 or vbBinaryCompare で大文字小文字を比較します。
Sub Split7()
Dim str() As String
str = Split("aaaebbbEccc", "E", , 0)
MsgBox Join(str, vbLf)
End Sub
Sub Split8()
Dim str() As String
str = Split("aaaebbbEccc", "E", , vbBinaryCompare)
MsgBox Join(str, vbLf)
End Sub
aとbの間にe、bとcの間にEがあります。
区切り文字は”E”です。
“E”で判定された部分で分割されて、配列に格納されています。
1 or vbTextCompare で大文字小文字を比較しません。
Sub Split9()
Dim str() As String
str = Split("aaaebbbEccc", "E", , 1)
MsgBox Join(str, vbLf)
End Sub
Sub Split10()
Dim str() As String
str = Split("aaaebbbEccc", "E", , vbTextCompare)
MsgBox Join(str, vbLf)
End Sub
aとbの間にe、bとcの間にEがあります。
区切り文字は”E”です。
“e”と”E”で判定された部分で分割されて、配列に格納されています。
セルから文字列を取得してセルに設定
B2の文字列とC2の区切り文字を取得して配列の内容をD2に表示させます。
Sub Split11()
Dim str() As String
Dim kugiri, moji As String
'セルから文字列を取得
moji = Cells(2, 2)
'セルから区切り文字を取得
kugiri = Cells(2, 3)
'Splitで配列に格納
str = Split(moji, kugiri)
'配列の内容をセルに表示
Cells(2, 4) = Join(str, vbLf)
End Sub
配列の内容がD2に表示されました。
繰り返し処理(文字列、区切り文字)
B列の文字列とC列の区切り文字を取得して配列の内容をD列に表示させます。
C5には” “を入力していて、C6には空白です。
Sub Split12()
Dim str() As String
Dim kugiri, moji As String
Dim i As Integer
i = 2
Do While Cells(i, 2) <> ""
'セルから文字列を取得
moji = Cells(i, 2)
'セルから区切り文字を取得
kugiri = Cells(i, 3)
'Splitで配列に格納
str = Split(moji, kugiri)
'配列の内容をセルに表示
Cells(i, 4) = Join(str, vbLf)
i = i + 1
Loop
End Sub
Sub InStr1()
MsgBox InStr("abcde", "c") & "番目にあります"
End Sub
指定した文字列が”c”なので3が返されます。
文字列に指定した文字列が無い場合
Sub InStr2()
MsgBox InStr("abcde", "f") & "番目にあります"
End Sub
指定した文字列が”f”なので見つからず0が返されます。
指定した文字列が複数存在する場合
Sub InStr3()
MsgBox InStr("abcdec", "c") & "番目にあります"
End Sub
3番目と6番目に指定した文字列の”c”があります。
最初に見つけた位置を返すため、3が返されました。
InStr関数で開始位置を設定
Sub InStr4()
MsgBox InStr(4, "abcdec", "c") & "番目にあります"
End Sub
3番目と6番目に指定した文字列の”c”があります。
検索する開始位置を4に設定しています。
開始位置が4のため6番目の”c”の位置を返します。
InStr関数で比較方法を設定
比較方法ですが、大文字小文字を比較するしないの設定が出来ます。
比較方法を設定する場合は、開始位置も設定しないとエラーになります。
0 or vbBinaryCompare で大文字小文字を比較します。
Sub InStr5()
MsgBox InStr(1, "abcdeC", "C", 0) & "番目にあります"
End Sub
Sub InStr6()
MsgBox InStr(1, "abcdeC", "C", vbBinaryCompare) & "番目にあります"
End Sub
3番目に”c”、6番目に”C”があり、”C”を指定します。
6番目の”C”の位置が返されます。
1 or vbTextCompare で大文字小文字を比較しません。
Sub InSt7()
MsgBox InStr(1, "abcdeC", "C", 1) & "番目にあります"
End Sub
Sub InStr8()
MsgBox InStr(1, "abcdeC", "C", vbTextCompare) & "番目にあります"
End Sub
3番目に”c”、6番目に”C”があり、”C”を指定します。
大文字小文字を比較しないため、3番目の”c”の位置が返されます。
開始位置を設定しない時に発生するエラー
Sub InStrErr()
MsgBox InStr("abcdeC", "C", vbTextCompare) & "番目にあります"
End Sub
開始位置を設定していません。
処理を実行時にこのエラーが発生します。
セルから文字列を取得してセルに設定
B2の文字列をC2の文字列が検索して結果をD2に表示させます。
Sub InStr9()
Dim str, find, rep As String
str = Cells(2, 2)
find = Cells(2, 3)
Cells(2, 4) = InStr(str, find) & "番目にあります。"
End Sub
“c”が3番目にあるので、3の値が返されてD2に結果が表示されました。
繰り返し処理(指定した文字列)
B2の文字列を取得して、C列にある指定した文字列が含まれるか確認します。
Sub InStr10()
Dim str, kekka As String
Dim find() As String
Dim i, retuNum As Integer
str = Cells(2, 2)
'指定した文字列の列番号を設定します
retuNum = 3
'指定した文字列のリストを設定します
find() = リストの設定(retuNum)
i = 1
kekka = ""
'指定した文字列をリスト分繰り返します
For Each Var In find
'指定した文字列が存在するか確認します。
If InStr(str, find(i - 1)) <> 0 Then
kekka = kekka & find(i - 1) & "が" & InStr(str, find(i - 1)) & "番目にあります。"
End If
i = i + 1
Next
If kekka = "" Then
kekka = "指定した文字列がありません。"
End If
Cells(2, 4) = kekka
End Sub
Functionを使用して、リストの設定という関数みたいな物を作成しています。
リストの設定の内容は指定した文字列のリストを作成して返しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
指定した文字列の”c”と”bc”があるため結果がD2に表示されます。
繰り返し処理(文字列、指定した文字列)
B列の文字列をC2の文字列が検索して、結果をD列に表示させます。
Sub InStr11()
Dim kekka As String
Dim str() As String
Dim find() As String
Dim i, j, retuNum As Integer
'文字列の列番号を設定します
retuNum = 2
'文字列のリストを設定します
str() = リストの設定(retuNum)
'指定した文字列の列番号を設定します
retuNum = 3
'指定した文字列のリストを設定します
find() = リストの設定(retuNum)
i = 1
'文字列をリスト分繰り返します
For Each Var In str
j = 1
kekka = ""
'指定した文字列をリスト分繰り返します
For Each Var2 In find
'指定した文字列が存在するか確認します
If InStr(str(i - 1), find(j - 1)) <> 0 Then
kekka = kekka & find(j - 1) & "が" & InStr(str(i - 1), find(j - 1)) & "番目にあります。"
End If
j = j + 1
Next
If kekka = "" Then
kekka = "指定した文字列がありません。"
End If
Cells(i + 1, 4) = kekka
i = i + 1
Next
End Sub
リストの設定の内容は指定した文字列のリストと文字列のリストを作成して返しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
それぞれの行で指定した文字列が存在するか確認して、結果を表示しています。
繰り返し処理(文字列、指定した文字列、比較方法を設定)
大文字小文字を比較しない方法で複数の文字列と指定した文字列の確認を行います。
C列に大文字のBを設定しています。
Sub InStr12()
Dim kekka As String
Dim str() As String
Dim find() As String
Dim i, j, retuNum As Integer
'文字列の列番号を設定します
retuNum = 2
'文字列のリストを設定します
str() = リストの設定(retuNum)
'指定した文字列の列番号を設定します
retuNum = 3
'指定した文字列のリストを設定します
find() = リストの設定(retuNum)
i = 1
'文字列をリスト分繰り返します
For Each Var In str
j = 1
kekka = ""
'指定した文字列をリスト分繰り返します
For Each Var2 In find
'指定した文字列が存在するか確認します。
If InStr(1, str(i - 1), find(j - 1), 1) <> 0 Then
kekka = kekka & find(j - 1) & "が" & InStr(1, str(i - 1), find(j - 1), 1) & "番目にあります。"
End If
j = j + 1
Next
If kekka = "" Then
kekka = "指定した文字列がありません。"
End If
Cells(i + 1, 4) = kekka
i = i + 1
Next
End Sub
InStr関数を使用している所で開始位置と比較方法を1に設定しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
Sub 文字列の結合1()
Dim str As String
str = "abc" + " " + "def"
MsgBox str
End Sub
“abc”と” “と”def”の結合なので “abc def”が表示されます。
“&”を使用する場合
Sub 文字列の結合2()
Dim str As String
str = "abc" & " " & "def"
MsgBox str
End Sub
“abc”と” “と”def”の結合なので “abc def”が表示されます。
Joinを使用する場合
Sub 文字列の結合3()
Dim str(1) As String
str(0) = "abc"
str(1) = "def"
MsgBox Join(str)
End Sub
strの1次元配列に”abc”と”def”が設定されています。
任意の区切り文字を設定していないため”abc”と”def”の間に” “が入ります。
Joinを使用して任意の区切り文字を設定する場合
Sub 文字列の結合4()
Dim str(1) As String
str(0) = "abc"
str(1) = "def"
MsgBox Join(str, ",")
End Sub
任意の区切り文字を”,”に設定しました。
任意の区切り文字を”,”に設定してしたため”abc”と”def”の間に”,”が入ります。
文字列型配列に文字列が無い場合
Sub Join1()
Dim str() As String
MsgBox Join(str)
End Sub
配列には何も設定していません。
何も設定されていないため何も表示されません。
文字列型配列が2次元配列の場合
Sub Join2()
Dim str() As String
ReDim str(1, 2)
str(0, 0) = "a"
str(0, 1) = "b"
str(0, 2) = "c"
str(1, 0) = "d"
str(1, 1) = "e"
str(1, 2) = "f"
MsgBox Join(str)
End Sub
Joinは1次元配列しか設定できませんが、2次元配列を設定します。
1次元配列しか設定できないのでエラーが発生します。
セルから文字列を取得して結合した文字列をセルに設定
セルに複数の行が設定されています。
A~D列の値を取得し、E列に結合して表示させます。
Sub Join3()
Dim str() As String
Dim i, j As Integer
Dim gyo, retu As Integer
'入力されている行数を取得
gyo = Cells(1, 1).End(xlDown).Row
'入力されている列数を取得
retu = Cells(1, 1).End(xlToRight).Column
'配列の設定
ReDim str(retu - 1)
'文字列の結合を繰り返し
For i = 2 To gyo
For j = 1 To retu
'セルの文字列を配列に設定
str(j - 1) = Cells(i, j)
Next j
'配列の文字列を列の末端の隣のセルに設定
Cells(i, retu + 1) = Join(str, ",")
Next i
End Sub
Sub 結合時間の計測1()
Dim setStr As String
Dim i, j As Integer
'計測時間の宣言
Dim startTime As Double
Dim endTime As Double
Dim processTime As Double
'開始時間取得
startTime = Timer
'初期設定
setStr = ""
'文字列の結合を繰り返し
For i = 1 To 1000
For j = 1 To 47
'セルの文字列を配列に設定
setStr = setStr + Cells(j, 2) + ","
Next j
Next i
'終了時間取得
endTime = Timer
'処理時間表示
processTime = endTime - startTime
MsgBox "処理時間:" & processTime
End Sub
“&”を使用する場合
Sub 結合時間の計測2()
Dim setStr As String
Dim i, j As Integer
'計測時間の宣言
Dim startTime As Double
Dim endTime As Double
Dim processTime As Double
'開始時間取得
startTime = Timer
'初期設定
setStr = ""
'文字列の結合を繰り返し
For i = 1 To 1000
For j = 1 To 47
'セルの文字列を配列に設定
setStr = setStr & Cells(j, 2) & ","
Next j
Next i
'終了時間取得
endTime = Timer
'処理時間表示
processTime = endTime - startTime
MsgBox "処理時間:" & processTime
End Sub
Joinを使用する場合
Sub 結合時間の計測3()
Dim str(46999) As String
Dim i, j As Integer
Dim setStr As String
'計測時間の宣言
Dim startTime As Double
Dim endTime As Double
Dim processTime As Double
'開始時間取得
startTime = Timer
'文字列の結合を繰り返し
For i = 1 To 1000
For j = 1 To 47
'セルの文字列を配列に設定
str(((i - 1) * 47) + j - 1) = Cells(j, 2)
Next j
Next i
'配列の文字列をString型に設定
setStr = Join(str, ",")
'終了時間取得
endTime = Timer
'処理時間表示
processTime = endTime - startTime
MsgBox "処理時間:" & processTime
End Sub
Function 引数と戻り値なし1()
MsgBox "引数と戻り値なし1"
End Function
メイン側でCallを記入しないで呼び出しをします。
Sub メイン2()
引数と戻り値なし2
End Sub
Function 引数と戻り値なし2()
MsgBox "引数と戻り値なし2"
End Function
プログラマーによって記入方法が変わるので注意してください。
メイン側でFunctionではなくSubを使用した関数を呼び出します。
Sub メイン3()
Call 引数と戻り値なし3()
End Sub
Sub 引数と戻り値なし3()
MsgBox "引数と戻り値なし3"
End Sub
この様に戻り値がなければ、FunctionかSubのどちらでも問題ありません。
開発元のコーディングルールに基づいて開発を行って下さい。
引数あり、戻り値なしの場合
引数あり、戻り値なしの場合のFunctionの定義
Function 適当な名前(ByVal Or ByRef(省略可) 変数名 as データの型)
処理内容
End Function
引数はByRefとByValの2つの記入方法があり、省略した場合はByRefが設定されます。
ByRefとByValは後程説明します。
メイン側がCallで呼び出しをします。
Sub メイン4()
Dim text As String
text = "引数あり戻り値なし4"
Call 引数あり戻り値なし(text)
End Sub
()の中にString型を設定しています。
Function 引数あり戻り値なし(ByVal text As String)
MsgBox text
End Function
引数を渡してそのまま表示しました。
メイン側でCallを記入しないで呼び出しをします。
Sub メイン5()
Dim text As String
text = "引数あり戻り値なし5"
引数あり戻り値なし text
End Sub
引数あり戻り値なし関数の後に” “とtextを記入します。
Functionは変更していません。
Function 引数あり戻り値なし(ByVal text As String)
MsgBox text
End Function
この様に引数に渡す内容を変更すれば結果が変わります。
メイン側でFunctionではなくSubを使用した関数を呼び出します。
Sub メイン6()
Dim text As String
text = "引数あり戻り値なし6"
Call 引数あり戻り値なし6(text)
End Sub
FunctionをSubに変更しただけです。
Sub 引数あり戻り値なし6(ByVal text As String)
MsgBox text
End Sub
渡す引数と受け取る引数の型が不一致の時に発生するエラー
エラーが発生する場合は大体コピペで中身を変更した時に発生します。
コピペをする時は注意して下さい。
ByValの場合
Sub メイン7()
Dim text As String
text = "あいう"
Call ByValを利用(text)
End Sub
渡す引数はString型に設定しています。
Function ByValを利用(ByVal text As Integer)
MsgBox text
End Function
受け取る側はInteger型に設定しています。
この時に処理を実行した場合に発生するエラーの内容です。
ByRefの場合
Sub メイン8()
Dim text As Integer
text = 4
Call ByRefを利用(text)
End Sub
渡す引数はInteger型に設定しています。
Function ByRefを利用(ByRef text As String)
MsgBox text
End Function
受け取る側はString型に設定しています。
この時に処理を実行した場合に発生するエラーの内容です。
渡す引数はInteger型で受け取る引数はString型なのでコンパイルエラーが発生します。
この様にByValとByRefでエラーの内容が変わりますので注意して下さい。
引数なし、戻り値ありの場合
引数なし、戻り値ありの場合のFunctionの定義
Function 適当な名前() As データの型
処理内容
適当な名前 = データの型
End Function
戻り値がある場合はFunctionで設定した名前に戻り値のデータを=で設定します。
Sub メイン9()
Dim text As String
text = 引数なし戻り値あり() '()を省略する事も可能です。
MsgBox text
End Sub
Function側で戻り値を設定している場合はCallを使用しません。
メイン側でFunctioの戻り値を受け取ります。
Function 引数なし戻り値あり() As String
Dim text As String
text = "String型が戻り値です"
引数なし戻り値あり = text
End Function
Function側の戻り値は=で設定します。
Function側の戻り値が表示されました。
戻り値の型が不一致の時に発生するエラー
エラーが発生する場合は大体コピペで中身を変更した時に発生します。
コピペをする時は注意して下さい。
Sub メイン10()
Dim i As Integer
i = 引数なし戻り値あり()
MsgBox i
End Sub
受け取り側がIntegerで受け取っています。
Function 引数なし戻り値あり() As String
Dim text As String
text = "String型が戻り値です"
引数なし戻り値あり = text
End Function
戻り値はString型で戻しています。
処理の実行時に実行時エラー’13’が発生します。
引数あり、戻り値ありの場合
引数あり、戻り値ありの場合のFunctionの定義
Function 適当な名前(ByVal Or ByRef(省略可) 変数名 as データの型) As データの型
処理内容
適当な名前 = データの型
End Function
メイン側でFunction側の戻り値を”=”で受け取ります。
Sub メイン11()
Dim text As String
text = "あいう"
text = 引数あり戻り値あり(text)
MsgBox text
End Sub
メイン側でtextの内容を”あいう”で設定します。
Function 引数あり戻り値あり(ByVal text As String) As String
text = "えおか"
引数あり戻り値あり = text
End Function
Function側で戻り値を”えおか”に設定します。
メイン側で”えおか”が表示されました。
引数複数、戻り値配列の場合
引数複数、戻り値配列の場合のFunctionの定義
Function プロシージャ名(ByVal 引数名1 As データ型, ByVal 引数名2 As データ型, ・・・) As 戻り値のデータ型()
処理内容
プロシージャ名 = 戻り値()
End Function
メイン側で配列を受け取れるように配列の変数を設定します。
Sub メイン12()
Dim text1, text2, text3 As String
Dim textList() As String
text1 = "あいう"
text2 = "aiu"
text3 = "アイウ"
textList = リスト作成(text1, text2, text3)
MsgBox textList(0) + "," + textList(1) + "," + textList(2)
End Sub
text1,2,3に”あいう”,”aiu”,”アイウ”を設定してFunction側を呼び出します。
Function側の戻り値はString型の配列なのでString型の配列で受け取ります。
Function リスト作成(ByVal text1 As String, ByVal text2 As String, ByVal text3 As String) As String()
Dim list(2) As String
list(0) = text1
list(1) = text2
list(2) = text3
リスト作成 = list()
End Function
Sub メイン13()
Dim text As String
text = "あいう"
Call ByVal使用(text)
MsgBox text
End Sub
Function ByVal使用(ByVal text As String)
'あいうからabcに変更
text = "abc"
End Function
メイン側でtextに”あいう”を設定してFunction側を呼び出しています。
Function側は”あいう”を”abc”に変更しています。
結果は”あいう”が表示されました。
ByRefの場合
Sub メイン14()
Dim text As String
text = "あいう"
Call ByRef使用(text)
MsgBox text
End Sub
Function ByRef使用(ByRef text As String)
'あいうからabcに変更
text = "abc"
End Function
Sub Replace15()
Dim str, find, rep As String
str = "あいうえお"
find = "い"
rep = "か"
MsgBox Replace(str, find, rep)
End Sub
“い”が”か”に置換されています。
セルから文字列を取得してセルに設定
Sub Replace16()
Dim str, find, rep As String
str = Cells(2, 2)
find = Cells(2, 3)
rep = Cells(2, 4)
Cells(2, 5) = Replace(str, find, rep)
End Sub
“い”が”か”に置換されました。
繰り返し処理(検索する文字列)
Sub Replace17()
Dim str, rep As String
Dim find() As String
Dim i, retuNum As Integer
str = Cells(2, 2)
rep = Cells(2, 4)
'検索する文字列の列番号を設定します
retuNum = 3
'検索する文字列のリストを設定します
find() = リストの設定(retuNum)
i = 1
'文字列の置換をリスト分繰り返します
For Each Var In find
str = Replace(str, find(i - 1), rep)
i = i + 1
Next
Cells(2, 5) = str
End Sub
今回はFunctionを使用しています。
Functionの内容は検索のリストを作成して返却しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
複数の記号がすべて”-“に変換されました。
繰り返し処理(文字列、検索する文字列)
Sub Replace18()
Dim rep As String
Dim str() As String
Dim find() As String
Dim i, j, retuNum As Integer
rep = Cells(2, 4)
'文字列の列番号を設定します
retuNum = 2
'検索する文字列のリストを設定します
str() = リストの設定(retuNum)
'検索する文字列の列番号を設定します
retuNum = 3
'検索する文字列のリストを設定します
find() = リストの設定(retuNum)
i = 1
'文字列をリスト分繰り返します
For Each Var In str
j = 1
'文字列の置換をリスト分繰り返します
For Each Var2 In find
str(i - 1) = Replace(str(i - 1), find(j - 1), rep)
j = j + 1
Next
Cells(i + 1, 5) = str(i - 1)
i = i + 1
Next
End Sub
Functionは文字列のリストと検索のリストの内容を返却しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
置換する文字列が1行毎に置換されました。
繰り返し処理(文字列、検索する文字列、置換する文字列)
検索文字と置換文字は#→a、%→b、$→c、!→d、”→e、&→fという内容で置換します。
Sub Replace19()
Dim str() As String
Dim find() As String
Dim rep() As String
Dim i, j, retuNum As Integer
'文字列の列番号を設定します
retuNum = 2
'検索する文字列のリストを設定します
str() = リストの設定(retuNum)
'検索する文字列の列番号を設定します
retuNum = 3
'検索する文字列のリストを設定します
find() = リストの設定(retuNum)
'置換する文字列の列番号を設定します
retuNum = 4
'置換する文字列のリストを設定します
rep() = リストの設定(retuNum)
i = 1
'文字列をリスト分繰り返します
For Each Var In str
j = 1
'文字列の置換をリスト分繰り返します
For Each Var2 In find
str(i - 1) = Replace(str(i - 1), find(j - 1), rep(j - 1))
j = j + 1
Next
Cells(i + 1, 5) = str(i - 1)
i = i + 1
Next
End Sub
Functionは文字列のリスト、検索のリストと置換のリストの内容を返却しています。
Function リストの設定(ByVal retuNum As Integer) As String()
Dim list() As String
Dim i As Integer
Dim kazu As Long
kazu = Cells(1000, retuNum).End(xlUp).Row
ReDim list(kazu - 2)
For i = 2 To kazu
list(i - 2) = Cells(i, retuNum)
Next i
リストの設定 = list()
End Function
Sub Mid2()
Dim str As String
str = "abcde"
MsgBox Mid(str, 3, 2)
End Sub
str = abcdeなので3文字目から2文字までのcdが表示されます。
Mid関数内で文字列の結合
Sub Mid3()
Dim str As String
str = "abcde"
MsgBox Mid(str + "fgh", 7, 2)
End Sub
Mid関数の文字列は”abcde”+”fgh”=”abcdefgh”になります。
そこから7文字目から2文字なのでghで表示されます。
問題1
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Mid4()
Dim str As String
str = "あいうえお"
MsgBox Mid(str, 2, 2)
End Sub
問題2
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Mid5()
Dim str1, str2 As String
str1 = "あいうえお"
str2 = "かきくけこ"
MsgBox Mid(str1 + str2, 2 + 5, 2 + 1)
End Sub
問題1の答え
str = “あいうえお”でしたので2文字目から2文字ですので”いう”が表示されます。
問題2の答え
Mid(str1 + str2, 2 + 5, 2 + 1)
Mid(“あいうえおかきくけこ”, 7 , 3 )になるため”きくけ”が表示されます。
セルから文字列を取得して隣のセルに設定
B2から文字列を取得してC2に設定します。
Sub Mid6()
Dim str As String
str = Range("B2").Value
Range("C2").Value = Mid(str, 3, 2)
End Sub
処理の実行
cdの値がC2のセルに設定されました。
同様の処理内容
Mid関数内にRange(“B2”)を設定する。
Sub Mid7()
Range("C2").Value = Mid(Range("B2").Value, 3, 2)
End Sub
Rangeではなく、Cellsで設定する。
Sub Mid8()
Dim str As String
str = Cells(2, 2)
Cells(2, 3) = Mid(str, 3, 2)
End Sub
上記、2つの処理でもcdの値がC2のセルに設定されます。
Cellsのイメージ
繰り返し処理(for文)
B列に取得したい文字列が8行入力されています。
これを繰り返し処理でC列に3文字目から2文字まで取得して表示させます。
処理内容
Sub Mid9()
Dim str As String
Dim i As Integer
For i = 1 To 8
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Mid(str, 3, 2)
Next
End Sub
処理の結果
8行分3文字目から2文字まで取得できました。
繰り返し処理(Do While文)
for文ではFor i = 1 To 8と記載して8回処理をしたら終了する設定にしました。
Do While文では終了条件で繰り返し処理を終了させます。
終了条件はB列が空白になるまで繰り返し処理を行います。
つまりB10まで繰り返し処理を行います。
処理内容
Sub Mid10()
Dim str As String
Dim i As Integer
i = 1
Do While Cells(i + 1, 2) <> ""
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Mid(str, 3, 2)
i = i + 1 'この処理が抜けると無限ループになります。
Loop
End Sub
Sub Right2()
Dim str As String
str = "abcde"
MsgBox Right(str, 3)
End Sub
str = abcdeなので末尾から3文字までのcdeが表示されます。
Right関数内で文字列の結合
Sub Right3()
Dim str As String
str = "abcde"
MsgBox Right(str + "fgh", 7)
End Sub
Right関数の文字列は”abcde”+”fgh”=”abcdefgh”になります。
そこから末尾から7文字なのでbcdefghで表示されます。
問題1
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Right4()
Dim str As String
str = "あいうえお"
MsgBox Right(str, 2)
End Sub
問題2
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Right5()
Dim str1, str2 As String
str1 = "あいうえお"
str2 = "かきくけこ"
MsgBox Right(str1 + str2, 2 + 5)
End Sub
問題1の答え
str = “あいうえお”でしたので末尾からの2文字ですので”えお”が表示されます。
問題2の答え
Right(“あいうえお” + “かきくけこ”, 2 + 5)
Right(“あいうえおかきくけこ”, 7)になるため”えおかきくけこ”が表示されます。
セルから文字列を取得して隣のセルに設定
B2から文字列を取得してC2に設定します。
Sub Right6()
Dim str As String
str = Range("B2").Value
Range("C2").Value = Right(str, 3)
End Sub
処理の実行
cdeの値がC2のセルに設定されました。
同様の処理内容
Right関数内にRange(“B2”)を設定する。
Sub Right7()
Range("C2").Value = Right(Range("B2").Value, 3)
End Sub
Rangeではなく、Cellsで設定する。
Sub Right8()
Dim str As String
str = Cells(2, 2)
Cells(2, 3) = Right(str, 3)
End Sub
上記、2つの処理でもcdeの値がC2のセルに設定されます。
Cellsのイメージ
繰り返し処理(for文)
B列に取得したい文字列が8行入力されています。
これを繰り返し処理でC列に末尾から3文字取得して表示させます。
処理内容
Sub Right9()
Dim str As String
Dim i As Integer
For i = 1 To 8
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Right(str, 3)
Next
End Sub
処理の結果
8行分末尾から3文字まで取得できました。
繰り返し処理(Do While文)
for文ではFor i = 1 To 8と記載して8回処理をしたら終了する設定にしました。
Do While文では終了条件で繰り返し処理を終了させます。
終了条件はB列が空白になるまで繰り返し処理を行います。
つまりB10まで繰り返し処理を行います。
処理内容
Sub Right10()
Dim str As String
Dim i As Integer
i = 1
Do While Cells(i + 1, 2) <> ""
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Right(str, 3)
i = i + 1 'この処理が抜けると無限ループになります。
Loop
End Sub
Sub Left2()
Dim str As String
str = "abcde"
MsgBox Left(str, 3)
End Sub
str = abcdeなので先頭から3文字までのabcが表示されます。
Left関数内で文字列の結合
Sub Left3()
Dim str As String
str = "abcde"
MsgBox Left(str + "fgh", 7)
End Sub
Left関数ないの文字列は”abcde”+”fgh”=”abcdefgh”になります。
そこから先頭から7文字なのでabcdefgで表示されます。
問題1
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Left4()
Dim str As String
str = "あいうえお"
MsgBox Left(str, 2)
End Sub
問題2
以下の内容を実行したときにメッセージボックスに表示される内容はどの様になりますか。
Sub Left5()
Dim str1, str2 As String
str1 = "あいうえお"
str2 = "かきくけこ"
MsgBox Left(str1 + str2, 2 + 5)
End Sub
問題1の答え
str = “あいうえお”でしたので先頭からの2文字ですので”あい”が表示されます。
問題2の答え
Left(“あいうえお” + “かきくけこ”, 2 + 5)
Left(“あいうえおかきくけこ”, 7)になるため”あいうえおかき”が表示されます。
セルから文字列を取得して隣のセルに設定
B2から文字列を取得してC2に設定します。
Sub Left6()
Dim str As String
str = Range("B2").Value
Range("C2").Value = Left(str, 3)
End Sub
処理の実行
abcの値がC2のセルに設定されました。
同様の処理内容
Left関数内にRange(“B2”)を設定する。
Sub Left7()
Range("C2").Value = Left(Range("B2").Value, 3)
End Sub
Rangeではなく、Cellsで設定する。
Sub Left8()
Dim str As String
str = Cells(2, 2)
Cells(2, 3) = Left(str, 3)
End Sub
上記、2つの処理でもabcの値がC2のセルに設定されます。
Cellsのイメージ
繰り返し処理(for文)
B列に取得したい文字列が8行入力されています。
これを繰り返し処理でC列に先頭から3文字取得して表示させます。
処理内容
Sub Left9()
Dim str As String
Dim i As Integer
For i = 1 To 8
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Left(str, 3)
Next
End Sub
処理の結果
8行分先頭から3文字まで取得できました。
しかし、最後から2行の文字列は数値で表示されました。
VBA側で文字列として処理をしてもExcel側で数値に変換されます。
この表示を修正するにはセルの書式設定で文字列として表示させましょう。
これで数値が正常に文字列として表示されます。
繰り返し処理(Do While文)
for文ではFor i = 1 To 8と記載して8回処理をしたら終了する設定にしました。
Do While文では終了条件で繰り返し処理を終了させます。
終了条件はB列が空白になるまで繰り返し処理を行います。
つまりB10まで繰り返し処理を行います。
処理内容
Sub Left10()
Dim str As String
Dim i As Integer
i = 1
Do While Cells(i + 1, 2) <> ""
str = Cells(i + 1, 2)
Cells(i + 1, 3) = Left(str, 3)
i = i + 1 'この処理が抜けると無限ループになります。
Loop
End Sub
Sub サブフォルダ含むファイル名取得()
Dim maisu As Integer
Dim strFolderpass As String
'枚数の初期設定をします。
maisu = 1
'対象フォルダのパスを設定
strFolderpass = Range("B1").Value
'ファイルのパスの判定
If strFolderpass = "" Or Range("B2").Value = "" Then
MsgBox "対象フォルダのパスがありません。パスを入力してください。"
Else
'ファイル名変更のメソッドを呼び出します。
Call ファイル名変更(strFolderpass, maisu)
End If
End Sub
Sub ファイル名変更(strFolderpass As String, maisu As Integer)
Dim objfFSO As Object
Dim objFiles As Object
Dim objFile As Object
Dim objSubFolders As Object
Dim objSubFolder As Object
Dim fileName, file, filePath As String
Dim kakucho, seko As String
Dim i As Integer
Dim syuturyokuPath As String
'ファイルやフォルダを操作するオブジェクトの生成
Set objfFSO = CreateObject("Scripting.FileSystemObject")
'対象フォルダのファイルオブジェクトをセット
Set objFiles = objfFSO.GetFolder(strFolderpass).Files
i = 1
'ファイルをコピーして出力先のフォルダにファイル名を変更して貼り付け
For Each objFile In objFiles
file = objFile.Name
filePath = objFile.Path
fileName = Mid(filePath, Len(Range("B1")) + 1, Len(filePath) - Len(Range("B1")) - Len(file))
fileName = Replace(fileName, "\", "_")
kakucho = Mid(file, InStr(file, "."))
syuturyokuPath = Range("B2").Value + "\"
Select Case i Mod 3
Case 1
seko = "施工前"
Case 2
seko = "施工中"
Case Else
seko = "施工後"
End Select
FileCopy filePath, syuturyokuPath & maisu & fileName & seko & kakucho
maisu = maisu + 1
i = i + 1
Next objFile
'対象フォルダのサブフォルダファイルオブジェクトをセット
Set objSubFolders = objfFSO.GetFolder(strFolderpass).SubFolders
'サブフォルダを含むファイル名取得
For Each objSubFolder In objSubFolders
If objSubFolder.Name <> "" Then
'サブフォルダのパスをメソッドへ渡して再帰的に処理を行う
Call ファイル名変更(objSubFolder.Path, maisu)
End If
Next objSubFolder
'使用したオブジェクトの解放
Set objfFSO = Nothing
Set objFiles = Nothing
Set objFile = Nothing
Set objSubFolders = Nothing
Set objSubFolder = Nothing
End Sub
上記で行っている処理の内容
受け取ったパス内にファイルが存在する分だけ処理を繰り返す。
ファイルをコピーして出力先のフォルダにファイル名を変更して貼り付け。
受け取ったパス内にフォルダが存在する分だけ処理を繰り返す。
サブフォルダのパスをファイル名変更メソッドに渡す。
'サブフォルダを含むファイル名取得
For Each objSubFolder In objSubFolders
If objSubFolder.Name <> "" Then
'サブフォルダのパスをメソッドへ渡して再帰的に処理を行う
Call ファイル名変更(objSubFolder.Path, maisu)
End If
Next objSubFolder
i = 1
'ファイルをコピーして出力先のフォルダにファイル名を変更して貼り付け
For Each objFile In objFiles
file = objFile.Name
filePath = objFile.Path
fileName = Mid(filePath, Len(Range("B1")) + 1, Len(filePath) - Len(Range("B1")) - Len(file))
fileName = Replace(fileName, "\", "_")
kakucho = Mid(file, InStr(file, "."))
syuturyokuPath = Range("B2").Value + "\"
Select Case i Mod 3
Case 1
seko = "施工前"
Case 2
seko = "施工中"
Case Else
seko = "施工後"
End Select
FileCopy filePath, syuturyokuPath & maisu & fileName & seko & kakucho
maisu = maisu + 1
i = i + 1
Next objFile
Sub サブフォルダ含むファイル名取得()
Dim maisu As Integer
Dim strFolderpass As String
'ファイル名一覧を出力する行番号を指定します。
maisu = 1
'対象フォルダのパスを設定
strFolderpass = Range("B1").Value
'ファイルのパスの判定
If strFolderpass = "" Or Range("B2").Value = "" Then
MsgBox "対象フォルダのパスがありません。パスを入力してください。"
Else
'ファイル名変更のメソッドを呼び出します。
Call ファイル名変更(strFolderpass, maisu)
End If
End Sub
Sub ファイル名変更(strFolderpass As String, maisu As Integer)
Dim objfFSO As Object
Dim objFiles As Object
Dim objFile As Object
Dim objSubFolders As Object
Dim objSubFolder As Object
Dim fileName, file, filePath As String
Dim kakucho, seko As String
Dim i As Integer
Dim syuturyokuPath As String
'ファイルやフォルダを操作するオブジェクトの生成
Set objfFSO = CreateObject("Scripting.FileSystemObject")
'対象フォルダのファイルオブジェクトをセット
Set objFiles = objfFSO.GetFolder(strFolderpass).Files
i = 1
'ファイルをコピーして出力先のフォルダにファイル名を変更して貼り付け
For Each objFile In objFiles
file = objFile.Name
filePath = objFile.Path
fileName = Mid(filePath, Len(Range("B1")) + 1, Len(filePath) - Len(Range("B1")) - Len(file))
fileName = Replace(fileName, "\", "_")
kakucho = Mid(file, InStr(file, "."))
syuturyokuPath = Range("B2").Value + "\"
Select Case i Mod 3
Case 1
seko = "施工前"
Case 2
seko = "施工中"
Case Else
seko = "施工後"
End Select
FileCopy filePath, syuturyokuPath & maisu & fileName & seko & kakucho
maisu = maisu + 1
i = i + 1
Next objFile
'対象フォルダのサブフォルダファイルオブジェクトをセット
Set objSubFolders = objfFSO.GetFolder(strFolderpass).SubFolders
'サブフォルダを含むファイル名取得
For Each objSubFolder In objSubFolders
If objSubFolder.Name <> "" Then
'サブフォルダのパスをメソッドへ渡して再帰的に処理を行う
Call ファイル名変更(objSubFolder.Path, maisu)
End If
Next objSubFolder
'使用したオブジェクトの解放
Set objfFSO = Nothing
Set objFiles = Nothing
Set objFile = Nothing
Set objSubFolders = Nothing
Set objSubFolder = Nothing
End Sub