こんばんは。
VBAについて聴きたいです。プログラムの経験は全くないので、どなたか教えていただけないでしょうか?
質問は以下のようになっております。
C15セルのテキストを分析して、項目とデータのペアを作成し、D列に項目、E列にデータという形式で出力してください。
AMP=$AWR29,SISP=BBWE,BLCK=(OLD,CLEAN,CLEAN),CNIY=(DUSDA,3),GREEN=CB,SPACE=(GLU,RED)
=の前の文字列を項目列で、
=の後の文字列()を含む、データ列にしたいです。
以上です。どうぞ宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
ほぼ皆さんと同じだと思いますが、せっかく作ったので…
Sub 項目データ分離()
Dim 行 As Long
Dim 列 As Long
Dim 括弧内 As Boolean
Dim 位置 As Long
Dim 元文字 As String
Dim 対象 As String
Dim 結果 As String
行 = 1
列 = 4
元文字 = Range("C15").Text
For 位置 = 1 To Len(元文字)
対象 = Mid(元文字, 位置, 1)
If 対象 = "," Then
If 括弧内 Then
結果 = 結果 & 対象
Else
Cells(行, 5).Value = 結果
結果 = ""
行 = 行 + 1
列 = 4
End If
Else
If 対象 = "=" Then
If 列 = 4 Then
Cells(行, 4).Value = 結果
結果 = ""
列 = 5
Else
結果 = 結果 & 対象
End If
Else
If 対象 = "(" Then 括弧内 = True
If 対象 = ")" Then 括弧内 = False
結果 = 結果 & 対象
End If
End If
Next
Cells(行, 5).Value = 結果
End Sub
--------------------------------------------------------------------------------
※ 回答とは直接関係ありませんがコードを載せる時のヒントです。
行頭の半角スペースとタブはカットされてしまいますが、全角スペースはカットされないそうです。
コードのタブ間隔を2以上にしているならば、コードを一度メモ帳に貼り付けて、タブ間隔の数の半角スペースを全角スペース1文字に全置換した物をここに貼り付けると字下げが残って見やすくなります。
No.6
- 回答日時:
こんにちは
すでに回答は出ていますけれど…
kay=valueの区切りは","なのでしょうが、value値が","を含むので。その際()内限定なのか、[]内などもあるのか、はたまた単独で含まれることもあるのかなどが、ご質問文の例示だけでははっきりしないですね。
(回答を見ていると、なんとなく()内限定としても良いみたいですが…)
規則がイマイチ明確ではないので、勝手に以下のようにゆるめにして設定してみました。
・key=valueのペアの区切りは","とする
・key値は","と"="は含まない。
・value値には","や"="が単独で含まれても良く(括弧内とは限らない)、空白文字列もあり得る
上記のルールで、例えば文字列
ww=a,b,c,xx=d=e=f,yy=,zz=h,i
は以下のように分解されます。
ww a,b,c
xx d=e=f
yy
zz h,i
以下はテストしたコードです。
Sub Sample()
Dim RE, reMatch
Dim str As String, s As String, tmp As Range
Dim i As Integer, n1 As Integer, n2 As Integer
Set RE = CreateObject("VBScript.RegExp")
RE.Pattern = "^([^,=]+=)|,([^,=]+=)"
RE.Global = True
str = Cells(15, 1).Text
Set reMatch = RE.Execute(str)
Set tmp = Range("D1")
For i = 0 To reMatch.Count - 1
n1 = reMatch(i).firstindex
n2 = Len(str)
If i = 0 Then n1 = 1 Else n1 = n1 + 2
If i < reMatch.Count - 1 Then n2 = reMatch(i + 1).firstindex
s = Mid(str, n1, n2 - n1 + 1)
n1 = InStr(s, "=")
tmp.Value = Left(s, n1 - 1)
tmp.Offset(, 1).Value = Mid(s, n1 + 1)
Set tmp = tmp.Offset(1)
Next i
End Sub
No.3
- 回答日時:
もう回答が付いてるけど折角だから書いておこう。
Option Explicit
Sub goo01()
Dim Str As String ' Source String
Dim Row As Long ' Destination Row
Dim Sts As String ' Status
Dim Nam As String ' Item Name
Dim Dat As String ' Item Data
Dim Pos As Long ' Position
Dim Chr As String ' Charator
Str = [C15]
Row = 15
Sts = "N"
Nam = ""
Dat = ""
For Pos = 1 To Len(Str)
Chr = Mid(Str, Pos, 1)
Select Case Sts ' Status
Case "N" ' Item Name
Select Case Chr
Case "="
Sts = "D"
Case Else
Nam = Nam & Chr
End Select
Case "D" ' Item Data
Select Case Chr
Case "("
Sts = "E"
Dat = Dat & Chr
Case ","
' Write
Cells(Row, "D").Value = Nam
Cells(Row, "E").Value = Dat
Row = Row + 1
Sts = "N"
Nam = ""
Dat = ""
Case Else
Dat = Dat & Chr
End Select
Case "E" ' Escape
Select Case Chr
Case ")"
Sts = "D"
End Select
Dat = Dat & Chr
End Select
Next Pos
If Len(Nam) > 0 Then
' Write
Cells(Row, "D").Value = Nam
Cells(Row, "E").Value = Dat
End If
End Sub
よろずやkinchan様
ご回答どうもありがとうございました。お礼のメール大変遅くなってしまって、申し訳ございませんでした。もう一つ追加質問をしたいですが、例えば、データ列に出力する文字列の中にSPACE=(GLU,RED,(40,50),RED)
()が二重になった場合はどうしたら良いでしょうか?
No.2
- 回答日時:
こんばんは!
文字列データが入っているのはC15セルで
D15・E15セル以降に表示させれば良いのですかね。
一例です。
Sub Sample1()
Dim k As Long, myFlg As Boolean
Dim myStr As String, buf As String
Dim myAry
For k = 1 To Len(Range("C15"))
myStr = Mid(Range("C15"), k, 1)
If myStr = "(" Then
myFlg = True
ElseIf myStr = ")" Then
myFlg = False
End If
If myFlg = False Then
If myStr = "," Then
myStr = "_"
End If
End If
buf = buf & myStr
Next k
myAry = Split(buf, "_")
For k = 0 To UBound(myAry)
Cells(k + 15, "D") = Left(myAry(k), InStr(myAry(k), "=") - 1)
Cells(k + 15, "E") = Mid(myAry(k), InStr(myAry(k), "=") + 1, Len(myAry(k)))
Next k
End Sub
カンマ「,」で区切れば簡単なのですが、
( )の中にもカンマがあるのでその区別が厄介ですね。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Excel(エクセル) VBA セルの値と同じ名前のシートにデータを貼り付けするやり方を教えてください 2 2022/05/17 16:26
- Visual Basic(VBA) Excel VBA 書式変更で困ってます。 オートフィルターの日付フィルターを用いて データの絞り込 2 2022/07/26 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
VBA 何かしら文字が入っていたら
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
空白セルをとばして転記
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
VBAのFind関数で結合セルを検索...
-
VBAを使って検索したセルをコピ...
-
マクロについて。S列の途中から...
-
【VBA】2つのシートの値を比較...
-
エクセルVBA シートモジュール...
-
文字列の結合を空白行まで実行
-
エクセルについて
-
VBAコンボボックスで選択した値...
-
Excel(VBA) 特定の条件に該当...
-
マクロ 最終列をコピーして最終...
-
エクセルVBAにて =A1=B1とすれ...
-
Excel VBA:エクセルのマクロで...
-
エクセルVBA intersect colu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
VBA 何かしら文字が入っていたら
-
Changeイベントでの複数セルの...
-
URLのリンク切れをマクロを使っ...
-
エクセルVBAにて =A1=B1とすれ...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
マクロについて。S列の途中から...
-
VBA UserFormからの転記で
-
targetをA列のセルに限定するに...
おすすめ情報