過去ログ

                                Page     588
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼文字列から配列変数を取得する方法  日高久雄 03/1/20(月) 12:33
   ┣Re:文字列から配列変数を取得する方法  ichinose 03/1/20(月) 15:23
   ┃  ┣訂正です  ichinose 03/1/20(月) 15:55
   ┃  ┗Re:文字列から配列変数を取得する方法  日高久雄 03/1/21(火) 13:13
   ┃     ┗Re:文字列から配列変数を取得する方法  ichinose 03/1/21(火) 22:01
   ┃        ┗夢でバグ発見しました・・・  ichinose 03/1/22(水) 2:15
   ┃           ┗Re:夢でバグ発見しました・・・  日高久雄 03/1/22(水) 13:22
   ┗Re:文字列から配列変数を取得する方法  ポンタ 03/1/21(火) 9:14
      ┗Re:文字列から配列変数を取得する方法  日高久雄 03/1/21(火) 13:18
         ┗Re:文字列から配列変数を取得する方法  ポンタ 03/1/21(火) 13:30
            ┗Re:文字列から配列変数を取得する方法  日高久雄 03/1/22(水) 13:27
               ┗Re:文字列から配列変数を取得する方法  ポンタ 03/1/22(水) 17:37

 ───────────────────────────────────────
 ■題名 : 文字列から配列変数を取得する方法
 ■名前 : 日高久雄 <hisao_hidaka@hotmail.com>
 ■日付 : 03/1/20(月) 12:33
 -------------------------------------------------------------------------
   昨年下記の質問に keinさんから 次のような回答を頂き 大変助かったのですが ちょっとした問題に
ぶつかり 配列がよく解らないので 困っています。マクロをどう変えればよいか教えてください。
全く別の方法でも結構です。宜しくお願い致します。

質問

range("A1")に "Aは(東京)です、Bは(大阪)です、Cは(名古屋)です。"
と文字列があったとします。VBAを使って range("B1")に東京、range("C1")に大阪、range("D1")に名古屋と表示
更に range("A2")に "Aは(1)です、Bは(2)です、Cは(3)です。"と表示させる方法は無いでしょうか。

上記質問に次の方法をkeinさんから教えていただきました。

Sub Test_MySt2()
  Dim i As Integer, j As Integer, k As Integer
  Dim MyAr1() As Integer, MyAr2() As Integer
  Dim Buf As String, Buf2 As String
  
  Buf = Range("A1").Value
  Range("A2").Value = Buf
  For i = 1 To Len(Buf)
   If Mid(Buf, i, 1) = "(" Then
     ReDim Preserve MyAr1(j)
     MyAr1(j) = i + 1
     j = j + 1
   ElseIf Mid(Buf, i, 1) = ")" Then
     ReDim Preserve MyAr2(k)
     MyAr2(k) = i
     k = k + 1
   End If
  Next i
  For i = LBound(MyAr1) To UBound(MyAr1)
   Buf2 = Mid(Buf, MyAr1(i), MyAr2(i) - MyAr1(i))
   Range("IV1").End(xlToLeft).Offset(, 1).Value = Buf2
   Range("A2").Replace Buf2, i + 1
  Next i
End Sub

ところで このマクロだと 例えば  "Aは(東京)です、Bは(大阪)です、Cは(名古屋)です、東京は晴天です"
とありますと range("A2")の ( )に入っていない2度目の東京のところも "1は晴天です"と変換されます。
( )内だけを 数字に変換したいのですが マクロをどのように 改変すれば宜しいでしょうか。どうか助けてください。
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : ichinose  ■日付 : 03/1/20(月) 15:23  -------------------------------------------------------------------------
   ▼日高久雄 さん:
こんにちは。色んな文字でテストしていませんが、ケインさんとは別ロジックです。
確認してみて下さい。
'===========================================
Sub test()
  Call moji_convert(Range("a1"))
'セルA1に「Aは(東京)です、Bは(大阪)です、Cは(名古屋)です、東京は晴天です」
'が入っているものとします
End Sub
'===========================================
Sub moji_convert(rng As Range)
  Dim idx As Long
  Dim jdx As Long
  Dim ques_str As String
  Dim ans() As String
  Dim cans() As String
  ques_str = rng.Value
  ans() = Split(ques_str, "(")
  jdx = 1
  For idx = LBound(ans()) To UBound(ans())
   cans = Split(ans(idx), ")")
   If UBound(cans()) - LBound(cans()) > 0 Then
     rng.Offset(0, idx).Value = cans(LBound(cans))
     ques_str = Replace$(ques_str, "(" & cans(LBound(cans)) & ")", "(" & jdx & ")")
     jdx = jdx + 1
     End If
   Erase cans
   Next
  rng.Offset(1, 0).Value = ques_str
End Sub
 ───────────────────────────────────────  ■題名 : 訂正です  ■名前 : ichinose  ■日付 : 03/1/20(月) 15:55  -------------------------------------------------------------------------
   ▼日高久雄 さん:
訂正です。
Sub moji_convert(rng As Range)
  Dim idx As Long
  Dim jdx As Long
  Dim ques_str As String
  Dim ans() As String
  Dim cans() As String
  ques_str = rng.Value
  ans() = Split(ques_str, "(")
  If UBound(ans()) - LBound(ans()) > 0 Then
    jdx = 1
    For idx = LBound(ans()) To UBound(ans())
     cans = Split(ans(idx), ")")
     If UBound(cans()) - LBound(cans()) > 0 Then
      rng.Offset(0, jdx).Value = cans(LBound(cans))
      ques_str = Replace$(ques_str, "(" & cans(LBound(cans)) & ")", "(" & jdx & ")")
      jdx = jdx + 1
      End If
     Erase cans
     Next
    rng.Offset(1, 0).Value = ques_str
    End If
End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : 日高久雄 <hisao_hidaka@hotmail.com>  ■日付 : 03/1/21(火) 13:13  -------------------------------------------------------------------------
   ▼ichinose さん:
有難うございました。素晴らしいです。
ひとつ 教えてください、この後 訂正ソフトも頂きましたが、実行結果は同じでした。
どちらもOKでした。申し訳ないですが 勉強のため 1回目のソフトに どう言った不都合があったのでしょうか、お教えくだされば幸甚です。
それと こんな素晴らしいプログラムが組めるには 何か良い参考書はないでしょうか?
基礎的な事はある程度解るのですが 特に配列がらみとなると ちょっとお手上げです。
>▼日高久雄 さん:
>こんにちは。色んな文字でテストしていませんが、ケインさんとは別ロジックです。
>確認してみて下さい。
>'===========================================
>Sub test()
>  Call moji_convert(Range("a1"))
>'セルA1に「Aは(東京)です、Bは(大阪)です、Cは(名古屋)です、東京は晴天です」
>'が入っているものとします
>End Sub
>'===========================================
>Sub moji_convert(rng As Range)
>  Dim idx As Long
>  Dim jdx As Long
>  Dim ques_str As String
>  Dim ans() As String
>  Dim cans() As String
>  ques_str = rng.Value
>  ans() = Split(ques_str, "(")
>  jdx = 1
>  For idx = LBound(ans()) To UBound(ans())
>   cans = Split(ans(idx), ")")
>   If UBound(cans()) - LBound(cans()) > 0 Then
>     rng.Offset(0, idx).Value = cans(LBound(cans))
>     ques_str = Replace$(ques_str, "(" & cans(LBound(cans)) & ")", "(" & jdx & ")")
>     jdx = jdx + 1
>     End If
>   Erase cans
>   Next
>  rng.Offset(1, 0).Value = ques_str
>End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : ichinose  ■日付 : 03/1/21(火) 22:01  -------------------------------------------------------------------------
   ▼日高久雄 さん:
こんばんは。
>この後 訂正ソフトも頂きましたが、実行結果は同じでした。
>どちらもOKでした。申し訳ないですが 勉強のため 1回目のソフトに どう言った不都合があったのでしょうか、お教えくだされば幸甚です。

「・・・(・・)・・・(・・・)・・」と対になった()が正しく記述されていれば、どっちでも動きますね。

>Sub moji_convert(rng As Range)
>  Dim idx As Long
>  Dim jdx As Long
>  Dim ques_str As String
>  Dim ans() As String
>  Dim cans() As String
>  ques_str = rng.Value
>  ans() = Split(ques_str, "(")
   If UBound(ans()) - LBound(ans()) > 0 Then
'このIF文で、「Aは東京)です」なんて文を弾いてます

>    jdx = 1
>    For idx = LBound(ans()) To UBound(ans())
>     cans = Split(ans(idx), ")")
>     If UBound(cans()) - LBound(cans()) > 0 Then
      rng.Offset(0, jdx).Value = cans(LBound(cans))
'              ここは、単なる記述ミスなんですが、
'             idxにしておくと、Lbound(ans())は、0から始まるんで
'             怖いでしょう?rng.offset(0,0)となっては・・・
'              ちゃんと()が対になってれば、起きないけど・・・ 
>      ques_str = Replace$(ques_str, "(" & cans(LBound(cans)) & ")", "(" & jdx & ")")
>      jdx = jdx + 1
>      End If
>     Erase cans
>     Next
>    rng.Offset(1, 0).Value = ques_str
>    End If
>End Sub


>それと こんな素晴らしいプログラムが組めるには 何か良い参考書はないでしょうか?
ははっ、ありがとうございます。お世辞でもうれしいです。


私なんかまだまだ^2 なんですが・・・・。
このサイトで投稿されているコードはできるかぎりチェック、チェックして・・・。
これはいつか使うときがありそう・・・と思うものは、はっきり言ってパクリます。
そして、インターフェースだけちょこっと変えて自分が後で使いたいときは、Callすればいいだけにしておいて、気が向いたら中身をトレースしています。
って、これ、全然、返事になってないですね。

こんなに難しい御質問、私には結局のところお答えできないんですが、
「ここに投稿されているコードをたくさん読んで、又、自分でもたくさん作ってみる・・・」を私も現在進行形でやっとります。つまり、このサイトが参考書です。

久しぶりにアルコールが入っていない夜なのに(実は昨日も新年会で・・)、アルコールが入っているような文章になってしまいました。
 ───────────────────────────────────────  ■題名 : 夢でバグ発見しました・・・  ■名前 : ichinose  ■日付 : 03/1/22(水) 2:15  -------------------------------------------------------------------------
   ▼日高久雄 さん:
こんばんは。眠っていたら、夢でバグ発見したので・・・。
'=========================================================
Sub moji_convert(rng As Range)
  Dim idx As Long
  Dim jdx As Long
  Dim ques_str As String
  Dim ans() As String
  Dim cans() As String
  ques_str = rng.Value
  ans() = Split(ques_str, "(")
  If UBound(ans()) - LBound(ans()) > 0 Then
    jdx = 1
    For idx = LBound(ans()) + 1 To UBound(ans())
'        ↑2番目からチェックしないと、最初が「)(」ときの不具合
     cans = Split(ans(idx), ")")
     If UBound(cans()) - LBound(cans()) > 0 Then
      rng.Offset(0, jdx).Value = cans(LBound(cans))
      cans(LBound(cans)) = jdx
      ans(idx) = Join(cans(), ")")
'      上2行は、()の中が全部「東京」だったとき、(1)・・(1)になってしまう
      jdx = jdx + 1
      End If
     Erase cans
     Next
    End If
  rng.Offset(1, 0).Value = Join(ans(), "(")
End Sub

やっぱり、まだまだです。
 ───────────────────────────────────────  ■題名 : Re:夢でバグ発見しました・・・  ■名前 : 日高久雄 <hisao_hidaka@hotmail.com>  ■日付 : 03/1/22(水) 13:22  -------------------------------------------------------------------------
   本当に助かりました。有難うございます。
今後も宜しくお願い致します。

▼ichinose さん:
>▼日高久雄 さん:
>こんばんは。眠っていたら、夢でバグ発見したので・・・。
>'=========================================================
>Sub moji_convert(rng As Range)
>  Dim idx As Long
>  Dim jdx As Long
>  Dim ques_str As String
>  Dim ans() As String
>  Dim cans() As String
>  ques_str = rng.Value
>  ans() = Split(ques_str, "(")
>  If UBound(ans()) - LBound(ans()) > 0 Then
>    jdx = 1
>    For idx = LBound(ans()) + 1 To UBound(ans())
> '        ↑2番目からチェックしないと、最初が「)(」ときの不具合
>     cans = Split(ans(idx), ")")
>     If UBound(cans()) - LBound(cans()) > 0 Then
>      rng.Offset(0, jdx).Value = cans(LBound(cans))
>      cans(LBound(cans)) = jdx
>      ans(idx) = Join(cans(), ")")
>'      上2行は、()の中が全部「東京」だったとき、(1)・・(1)になってしまう
>      jdx = jdx + 1
>      End If
>     Erase cans
>     Next
>    End If
>  rng.Offset(1, 0).Value = Join(ans(), "(")
>End Sub
>
>やっぱり、まだまだです。
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : ポンタ  ■日付 : 03/1/21(火) 9:14  -------------------------------------------------------------------------
   勉強がてら、正規表現を使ってやってみました。

Sub test()
  Dim objRE As Object, Matches As Object, Match As Object, objDic As Object
  Dim i As Integer, MyString As String
  Set objDic = CreateObject("Scripting.Dictionary")
  Set objRE = CreateObject("VBScript.RegExp")
  objRE.Pattern = "\([^\)]+\)"
  objRE.Global = True
  MyString = Range("A1").Value
  Set Matches = objRE.Execute(MyString)
  i = 1
  For Each Match In Matches
    If objDic.exists(Match.Value) = False Then
      objDic.Add Match.Value, "(" & i & ")"
      i = i + 1
    End If
  Next
  For Each Match In Matches
    objRE.Pattern = "\(" & Match.Value & "\)"
    MyString = objRE.Replace(MyString, objDic(Match.Value))
  Next
  Range("B1").Value = MyString
End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : 日高久雄 <hisao_hidaka@hotmail.com>  ■日付 : 03/1/21(火) 13:18  -------------------------------------------------------------------------
   ▼ポンタ さん:
有難うございました。( )の中身を range("B1:D1")に 抽出したかったのですが。

>勉強がてら、正規表現を使ってやってみました。
>
>Sub test()
>  Dim objRE As Object, Matches As Object, Match As Object, objDic As Object
>  Dim i As Integer, MyString As String
>  Set objDic = CreateObject("Scripting.Dictionary")
>  Set objRE = CreateObject("VBScript.RegExp")
>  objRE.Pattern = "\([^\)]+\)"
>  objRE.Global = True
>  MyString = Range("A1").Value
>  Set Matches = objRE.Execute(MyString)
>  i = 1
>  For Each Match In Matches
>    If objDic.exists(Match.Value) = False Then
>      objDic.Add Match.Value, "(" & i & ")"
>      i = i + 1
>    End If
>  Next
>  For Each Match In Matches
>    objRE.Pattern = "\(" & Match.Value & "\)"
>    MyString = objRE.Replace(MyString, objDic(Match.Value))
>  Next
>  Range("B1").Value = MyString
>End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : ポンタ  ■日付 : 03/1/21(火) 13:30  -------------------------------------------------------------------------
   忘れてました。(汗

Sub test()
  Dim objRE As Object, Matches As Object, Match As Object, objDic As Object
  Dim i As Integer, MyString As String
  Range("B1:IV1").ClearContents
  Set objDic = CreateObject("Scripting.Dictionary")
  Set objRE = CreateObject("VBScript.RegExp")
  objRE.Pattern = "\([^\)]+\)"
  objRE.Global = True
  MyString = Range("A1").Value
  Set Matches = objRE.Execute(MyString)
  i = 1
  For Each Match In Matches
    If objDic.exists(Match.Value) = False Then
      Range("IV1").End(xlToLeft).Offset(0, 1).Value = Mid(Match.Value, 2, Len(Match.Value) - 2)
      objDic.Add Match.Value, "(" & i & ")"
      i = i + 1
    End If
  Next
  For Each Match In Matches
    objRE.Pattern = "\(" & Match.Value & "\)"
    MyString = objRE.Replace(MyString, objDic(Match.Value))
  Next
  Range("A2").Value = MyString
End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : 日高久雄 <hisao_hidaka@hotmail.com>  ■日付 : 03/1/22(水) 13:27  -------------------------------------------------------------------------
   有難うございました。本当に助かりました。
どうしたら こんなプログラムが組めるようになるのでしょうか。
基礎はちょっとかじっているのですが 何か良い参考書でもあれば
教えてください。

▼ポンタ さん:
>忘れてました。(汗
>
>Sub test()
>  Dim objRE As Object, Matches As Object, Match As Object, objDic As Object
>  Dim i As Integer, MyString As String
>  Range("B1:IV1").ClearContents
>  Set objDic = CreateObject("Scripting.Dictionary")
>  Set objRE = CreateObject("VBScript.RegExp")
>  objRE.Pattern = "\([^\)]+\)"
>  objRE.Global = True
>  MyString = Range("A1").Value
>  Set Matches = objRE.Execute(MyString)
>  i = 1
>  For Each Match In Matches
>    If objDic.exists(Match.Value) = False Then
>      Range("IV1").End(xlToLeft).Offset(0, 1).Value = Mid(Match.Value, 2, Len(Match.Value) - 2)
>      objDic.Add Match.Value, "(" & i & ")"
>      i = i + 1
>    End If
>  Next
>  For Each Match In Matches
>    objRE.Pattern = "\(" & Match.Value & "\)"
>    MyString = objRE.Replace(MyString, objDic(Match.Value))
>  Next
>  Range("A2").Value = MyString
>End Sub
 ───────────────────────────────────────  ■題名 : Re:文字列から配列変数を取得する方法  ■名前 : ポンタ  ■日付 : 03/1/22(水) 17:37  -------------------------------------------------------------------------
   今回使った"正規表現"はVBScriptの機能なので、
どちらかというと応用の範疇だと思います。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 588