アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。
VBAについて聴きたいです。プログラムの経験は全くないので、どなたか教えていただけないでしょうか?
質問は以下のようになっております。

C15セルのテキストを分析して、項目とデータのペアを作成し、D列に項目、E列にデータという形式で出力してください。
AMP=$AWR29,SISP=BBWE,BLCK=(OLD,CLEAN,CLEAN),CNIY=(DUSDA,3),GREEN=CB,SPACE=(GLU,RED)

=の前の文字列を項目列で、
=の後の文字列()を含む、データ列にしたいです。
以上です。どうぞ宜しくお願い致します。

A 回答 (5件)

下図のような結果になれば良いのでしょうか?

「こんばんは。 VBAについて聴きたいです」の回答画像1
    • good
    • 0
この回答へのお礼

GooUserラック様、
こんばんは。答えとしてはそうなりたいです。ご指導を頂きたいですが。どうぞ宜しくお願い致します。

お礼日時:2018/04/15 21:31

こんばんは!



文字列データが入っているのは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
    • good
    • 1
この回答へのお礼

Tom04様
こんばんは。ご回答どうもありがとうございました。大変助かりました。参考にさせて頂きます。

お礼日時:2018/04/15 21:27

もう回答が付いてるけど折角だから書いておこう。


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
    • good
    • 0
この回答へのお礼

よろずやkinchan様
ご回答どうもありがとうございました。お礼のメール大変遅くなってしまって、申し訳ございませんでした。もう一つ追加質問をしたいですが、例えば、データ列に出力する文字列の中にSPACE=(GLU,RED,(40,50),RED)
()が二重になった場合はどうしたら良いでしょうか?

お礼日時:2018/04/16 21:02

ほぼ皆さんと同じだと思いますが、せっかく作ったので…



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文字に全置換した物をここに貼り付けると字下げが残って見やすくなります。
    • good
    • 1
この回答へのお礼

GooUserラック様

こんばんは。ご回答どうもありがとうございました。

お礼日時:2018/04/16 18:29

こんにちは



すでに回答は出ていますけれど…

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
    • good
    • 1
この回答へのお礼

fujillin様
こんばんは。ご回答どうもありがとうございました。参考にさせて頂きます。

お礼日時:2018/04/16 18:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!