Excel VBA 質問スレッド No.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関数などいろいろ探してみたのですが、うまくいきませんでした。

末筆ではございますが、ご教授よろしくお願いします。

[返信 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

[返信 2] Re : カンマ区切りの文字列の中から、何個目の文字列かを抜き出したい
投稿者 : てらてら     投稿日時 : 2022/06/24(Fri) 12:44:05
こんにちは。

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」で見つけた場所より左側に、「,」がいくつあるか数えています。

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インデックスを取得しています。

[返信 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
皆様ご投稿ありがとうございます。
皆様のコード確認しながら行っていたら、無事希望の値を返すことができました。
これで実用できそうです。
この度は誠にありがとうございました!

当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2022-07-07 12:35:40 )

Page
Top