Excel VBA 質問スレッド №829 (解決済)
カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : ちか 投稿日時 : 2022/06/24(Fri) 11:24:40 OS : Windows 10 EXCEL : Excel 2021
お世話になっております。
csvで読み込んだデータをExcelの特定の場所に書き込むVBAを作成しております。
置き換える関係で、
buf = .ReadAll
としてCSVのデータのヘッダー部分がすべてbufに入るようにしております。
書き込みは
ヘッダー部分のデータが何行目にあるかを宣言して、Excelに書き込むようにしているのですが、
このCSVのヘッダーがデータの追加などすると、少し変動してしまうことがあるようです。
なので、探してる文字はbufの何個目の文字列か抜き出せれば、
それを変数として、エクセルのあてはめができるかと考えました。
しかしinstr関数でbufから特定の文字を探してみたのですが、
何文字目の値を返すものらしく、何個目の文字列が返ってきません。
a,b,c,d
とある時に
dをinstr関数で探すと7個目になるかと思うのですが、
4の値が返ってくるようにしたいと考えています。
こちらは可能でしょうか?
find関数などいろいろ探してみたのですが、うまくいきませんでした。
末筆ではございますが、ご教授よろしくお願いします。
お世話になっております。
csvで読み込んだデータをExcelの特定の場所に書き込むVBAを作成しております。
置き換える関係で、
buf = .ReadAll
としてCSVのデータのヘッダー部分がすべてbufに入るようにしております。
書き込みは
ヘッダー部分のデータが何行目にあるかを宣言して、Excelに書き込むようにしているのですが、
このCSVのヘッダーがデータの追加などすると、少し変動してしまうことがあるようです。
なので、探してる文字はbufの何個目の文字列か抜き出せれば、
それを変数として、エクセルのあてはめができるかと考えました。
しかしinstr関数でbufから特定の文字を探してみたのですが、
何文字目の値を返すものらしく、何個目の文字列が返ってきません。
a,b,c,d
とある時に
dをinstr関数で探すと7個目になるかと思うのですが、
4の値が返ってくるようにしたいと考えています。
こちらは可能でしょうか?
find関数などいろいろ探してみたのですが、うまくいきませんでした。
末筆ではございますが、ご教授よろしくお願いします。
スポンサーリンク
[返信 1] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : tkit 投稿日時 : 2022/06/24(Fri) 11:45:54
配列を使います。
こんな感じでしょうか。
Dim bufArr() As String
bufArr = Split(buf,vbCrlf)
Dim n As Long
n = Split(bufArr(0),",")+1
配列を使います。
こんな感じでしょうか。
Dim bufArr() As String
bufArr = Split(buf,vbCrlf)
Dim n As Long
n = Split(bufArr(0),",")+1
[返信 2] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : てらてら 投稿日時 : 2022/06/24(Fri) 12:44:05
こんにちは。
instr関数は文字列の判定で使う事も多いですが、
今回のようなケースでは、あまり役に立たないように思います。
(find関数は論外ですね)
CSVのヘッダーという事で、"a,b,c,d" という例を挙げていましたが、
本来であれば、
"日付,商品,コード,個数,担当"
というような単語のリストと考えるのが妥当だと思います。
先に、tkitさんがおっしゃっていたとおり、Split関数で配列に分けて何番目かを見つけるのが定石かと思います。
Functionプロシージャで、書いてみましたので参考にしてみてください。
こんにちは。
instr関数は文字列の判定で使う事も多いですが、
今回のようなケースでは、あまり役に立たないように思います。
(find関数は論外ですね)
CSVのヘッダーという事で、"a,b,c,d" という例を挙げていましたが、
本来であれば、
"日付,商品,コード,個数,担当"
というような単語のリストと考えるのが妥当だと思います。
先に、tkitさんがおっしゃっていたとおり、Split関数で配列に分けて何番目かを見つけるのが定石かと思います。
Functionプロシージャで、書いてみましたので参考にしてみてください。
Sub test()
Dim myStr As String
myStr = "個数"
MsgBox searchItemNum(myStr) & "番目です"
End Sub
Function searchItemNum(searchWord As String)
Dim num As Long, i As Long
Dim buf As String
Dim s
Dim myArr() As String
buf = "日付,商品,コード,個数,担当"
myArr = Split(buf, ",")
i = 0
For Each s In myArr
If searchWord = s Then
num = i
Exit For
End If
i = i + 1
Next
searchItemNum = num + 1 '0番目からなので1を足す
End Function
[返信 3] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : さんこう 投稿日時 : 2022/06/24(Fri) 12:59:02
「InStr」で見つけた場所より左側に、「,」がいくつあるか数えています。
「InStr」で見つけた場所より左側に、「,」がいくつあるか数えています。
Sub Test()
Dim s As String, s1 As String, s2 As String
s1 = "日付,商品,コード,個数,担当"
s2 = "コード"
s = Left(s1, InStr(s1, s2) - 1)
MsgBox Len(s) - Len(Replace(s, ",", "")) + 1
End Sub
[返信 4] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : tkit 投稿日時 : 2022/06/24(Fri) 14:39:01
■[返信 1] tkitさん(2022-06-24 11:45:54)の記事
> 配列を使います。
> こんな感じでしょうか。
>
> Dim bufArr() As String
> bufArr = Split(buf,vbCrlf)
> Dim n As Long
> n = Split(bufArr(0),",")+1
>
間違っていました。
正しくは、
n = Ubound(Split(bufArr(0),",")) + 1
配列の要素のUpperインデックスを取得しています。
■[返信 1] tkitさん(2022-06-24 11:45:54)の記事
> 配列を使います。
> こんな感じでしょうか。
>
> Dim bufArr() As String
> bufArr = Split(buf,vbCrlf)
> Dim n As Long
> n = Split(bufArr(0),",")+1
>
間違っていました。
正しくは、
n = Ubound(Split(bufArr(0),",")) + 1
配列の要素のUpperインデックスを取得しています。
[返信 5] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : まっち 投稿日時 : 2022/06/24(Fri) 23:40:47
Sub sample
buf = "a,b,c,d"
arybuf = Split(buf, ",") ' LBound(arybuf)=0
i = WorksheetFunction.Match("d", arybuf, 0)
Debug.Print i; arybuf(i - 1)
End Sub
[返信 6] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : ちか 投稿日時 : 2022/06/27(Mon) 09:22:02
皆様ご投稿ありがとうございます。
皆様のコード確認しながら行っていたら、無事希望の値を返すことができました。
これで実用できそうです。
この度は誠にありがとうございました!
皆様ご投稿ありがとうございます。
皆様のコード確認しながら行っていたら、無事希望の値を返すことができました。
これで実用できそうです。
この度は誠にありがとうございました!
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2026-04-03 14:57:29 )