Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5797 / 13646 ツリー ←次へ | 前へ→

【48802】文字の抽出 なた 07/5/9(水) 16:12 質問[未読]
【48803】Re:文字の抽出 Kein 07/5/9(水) 18:02 回答[未読]
【48813】Re:文字の抽出 なた 07/5/10(木) 12:01 質問[未読]
【48817】Re:文字の抽出 Kein 07/5/10(木) 14:37 回答[未読]
【48825】Re:文字の抽出 なた 07/5/10(木) 18:46 お礼[未読]
【48804】Re:文字の抽出 ウッシ 07/5/9(水) 19:50 発言[未読]

【48802】文字の抽出
質問  なた E-MAIL  - 07/5/9(水) 16:12 -

引用なし
パスワード
   いつもお世話になっております。

下記の文字列Aを文字列Bとして出力したいのですが、
上手くいきません。
どなたかアドバイス頂ける方、ご教授願えませんでしょうか?

文字列A:N20,(Z-2.4),N20,(Z-5.0),N30,(Z-2.4),N30,(Z-5.0)
文字列B:N20,(Z-5.0),N30,(Z-5.0)

規則は、それぞれのナンバーの最大マイナス値になります。
N20の最大マイナスは(Z-5)で、N30の最大マイナスも(Z-5)なので、
文字列Bこれになります。

以前も皆様に教えていただき、現状は下記のコードにしていますが、
現状だとN20(Z-2.4),N30(Z-5.0)と出力されてしまいます。


Private Sub CommandButton1_Click()

Dim isy As Long
Dim m1Dic As Object
Dim v As Variant
Dim tmp As String
Dim B As String

tmp = "N20,(Z-2.4),N20,(Z-5.0),N30,(Z-2.4),N30,(Z-5.0)"

v = Split(tmp, ",")

Set m1Dic = CreateObject("Scripting.Dictionary")
For isy = UBound(v) To LBound(v) Step -1
  If Not IsEmpty(v(isy)) Then
    If Not m1Dic.Exists(v(isy)) Then
      B = v(isy) & "," & B
      m1Dic(v(isy)) = v(isy)
    End If
  End If
Next
  
MsgBox B

Set m1Dic = Nothing

End Sub

【48803】Re:文字の抽出
回答  Kein  - 07/5/9(水) 18:02 -

引用なし
パスワード
   アクティブシートの IT:IV列 を作業列として使います。
結果は変数 RetSt に格納されます。イミディエイトウィンドゥへ出力しますから
確認して下さい。なお、作業列の処理状態を見たい場合は、予め
>.CurrentRegion.ClearContents
の行頭に "'" を付けてコメント化して下さい。

Sub Check_Data()
  Dim Ary As Variant, Ary2 As Variant
  Dim i As Long, Num As Single
  Dim C As Range
  Dim V As String, MyS As String, RetSt As String
  Const CkSt As String = _
  "N20,(Z-2.4),N20,(Z-5),N30,(Z-2.4),N20,(Z-3.5),N30,(Z-5)"
 
  Application.ScreenUpdating = False
  Range("IT1:IU1").Value = Array("Data1", "Data2")
  Ary = Split(CkSt, ")")
  For i = 0 To UBound(Ary) - 1
   V = CStr(Ary(i)): Ary2 = Split(V, "-")
   MyS = Ary2(0)
   Num = Val(Ary2(1))
   If Left$(MyS, 1) = "," Then
     MyS = Right$(MyS, Len(MyS) - 1)
   End If
   Cells(i + 2, 254).Value = MyS
   Cells(i + 2, 255).Value = WorksheetFunction.Round(Num, 1)
   Erase Ary2
  Next i
  Range("IT:IU").Sort Key1:=Range("IT1"), Order1:=xlAscending, _
  Key2:=Range("IU1"), Order2:=xlDescending, Header:=xlYes, _
  Orientation:=xlSortColumns
  With Range("IU2", Range("IU65536").End(xlUp)).Offset(, 1)
   .Formula = "=IF($IT1<>$IT2,$IU2)"
   For Each C In .SpecialCells(3, 1)
     RetSt = RetSt & C.Offset(, -2).Value & "-" & _
     C.Offset(, -1).Value & "),"
   Next
   .CurrentRegion.ClearContents
  End With
  RetSt = Left$(RetSt, Len(RetSt) - 1)
  Application.ScreenUpdating = True
  Debug.Print RetSt
End Sub

【48804】Re:文字の抽出
発言  ウッシ  - 07/5/9(水) 19:50 -

引用なし
パスワード
   こんばんは

良く分かりません。

>文字列A:N20,(Z-2.4),N20,(Z-5.0),N30,(Z-2.4),N30,(Z-5.0)
それぞれのナンバーと値は交互に並んでいますか?

>規則は、それぞれのナンバーの最大マイナス値になります。
>N20の最大マイナスは(Z-5)で、N30の最大マイナスも(Z-5)
値は「(Z」括弧+英字1文字の後にマイナス値で、括弧閉じる。
でしょうか?

  Dim i   As Long
  Dim m1Dic As Object
  Dim V   As Variant
  Dim tmp  As String
  Dim B   As String
  Dim o   As Variant
  
  tmp = "N20,(Z-2.4),N20,(Z-5.0),N30,(Z-2.4),N30,(Z-5.0)"
  
  V = Split(tmp, ",")
  
  Set m1Dic = CreateObject("Scripting.Dictionary")
  For i = LBound(V) To UBound(V) Step 2
    If Not IsEmpty(V(i)) Then
      If Not m1Dic.Exists(V(i)) Then
        m1Dic(V(i)) = V(i + 1)
      Else
        If Val(Replace(Mid(m1Dic(V(i)), 3), ")", "")) > _
          Val(Replace(Mid(V(i + 1), 3), ")", "")) Then
          m1Dic(V(i)) = V(i + 1)
        End If
      End If
    End If
  Next
  o = m1Dic.keys
  For i = 0 To m1Dic.Count - 1
    If B = "" Then
      B = o(i) & "," & m1Dic(o(i))
    Else
      B = B & "," & o(i) & "," & m1Dic(o(i))
    End If
  Next

  MsgBox B
  
  Set m1Dic = Nothing

【48813】Re:文字の抽出
質問  なた E-MAIL  - 07/5/10(木) 12:01 -

引用なし
パスワード
   ▼Kein さん:
▼ウッシさん:

ご教授ありがとうございます。
やりたい事ができそうです。

Keinさんへ
あと、整数の値も扱いたいのですが、どこをどう変更したら
整数も扱えるのでしょうか。
色々、ためしにコードを触ってみたり調べたりしてみましたが、
私が触れば触るほど、泥沼に・・・・・。すいません。

数値的に、よりマイナス値をチョイスしたいです。
(下記の文字列Aを文字列Bとして抽出したいです)
(N30がかぶっており、Z1.0とZ-5.0なのでZ-5.0を抽出)

文字列A:"N20,(Z-5.0),N30,(Z1.0),N30,(Z-5.0)"
文字列B:"N20,(Z-5.0),N30(Z-5.0)

申し訳ありませんが、何卒よろしくお願いいたします。


>アクティブシートの IT:IV列 を作業列として使います。
>結果は変数 RetSt に格納されます。イミディエイトウィンドゥへ出力しますから
>確認して下さい。なお、作業列の処理状態を見たい場合は、予め
>>.CurrentRegion.ClearContents
>の行頭に "'" を付けてコメント化して下さい。
>
>Sub Check_Data()
>  Dim Ary As Variant, Ary2 As Variant
>  Dim i As Long, Num As Single
>  Dim C As Range
>  Dim V As String, MyS As String, RetSt As String
>  Const CkSt As String = _
>  "N20,(Z-2.4),N20,(Z-5),N30,(Z-2.4),N20,(Z-3.5),N30,(Z-5)"
> 
>  Application.ScreenUpdating = False
>  Range("IT1:IU1").Value = Array("Data1", "Data2")
>  Ary = Split(CkSt, ")")
>  For i = 0 To UBound(Ary) - 1
>   V = CStr(Ary(i)): Ary2 = Split(V, "-")
>   MyS = Ary2(0)
>   Num = Val(Ary2(1))
>   If Left$(MyS, 1) = "," Then
>     MyS = Right$(MyS, Len(MyS) - 1)
>   End If
>   Cells(i + 2, 254).Value = MyS
>   Cells(i + 2, 255).Value = WorksheetFunction.Round(Num, 1)
>   Erase Ary2
>  Next i
>  Range("IT:IU").Sort Key1:=Range("IT1"), Order1:=xlAscending, _
>  Key2:=Range("IU1"), Order2:=xlDescending, Header:=xlYes, _
>  Orientation:=xlSortColumns
>  With Range("IU2", Range("IU65536").End(xlUp)).Offset(, 1)
>   .Formula = "=IF($IT1<>$IT2,$IU2)"
>   For Each C In .SpecialCells(3, 1)
>     RetSt = RetSt & C.Offset(, -2).Value & "-" & _
>     C.Offset(, -1).Value & "),"
>   Next
>   .CurrentRegion.ClearContents
>  End With
>  RetSt = Left$(RetSt, Len(RetSt) - 1)
>  Application.ScreenUpdating = True
>  Debug.Print RetSt
>End Sub

【48817】Re:文字の抽出
回答  Kein  - 07/5/10(木) 14:37 -

引用なし
パスワード
   では、これでどうかな・・?

Sub Check_Data2()
  Dim Ary As Variant, Ary2 As Variant
  Dim i As Long, Num As Single
  Dim C As Range
  Dim V As String, MyS As String, RetSt As String
  Const CkSt As String = _
  "N20,(Z2.4),N20,(Z-6.0),N30,(Z1.0),N20,(Z-3.5),N30,(Z-5.0)"
 
  Application.ScreenUpdating = False
  Range("IT1:IU1").Value = Array("Data1", "Data2")
  Ary = Split(CkSt, ")")
  For i = 0 To UBound(Ary) - 1
   V = CStr(Ary(i)): Ary2 = Split(V, "Z")
   MyS = Ary2(0)
   Num = Val(Ary2(1))
   If Left$(MyS, 1) = "," Then
     MyS = Right$(MyS, Len(MyS) - 1)
   End If
   Cells(i + 2, 254).Value = MyS
   Cells(i + 2, 255).Value = Num
   Erase Ary2
  Next i
  Range("IT:IU").Sort Key1:=Range("IT1"), Order1:=xlAscending, _
  Key2:=Range("IU1"), Order2:=xlAscending, Header:=xlYes, _
  Orientation:=xlSortColumns
  With Range("IU2", Range("IU65536").End(xlUp)).Offset(, 1)
   .Formula = "=IF($IT1<>$IT2,$IU2)"
   For Each C In .SpecialCells(3, 1)
     RetSt = RetSt & C.Offset(, -2).Value & _
     "Z" & Format(C.Value, "###.0") & "),"
   Next
   '.CurrentRegion.ClearContents
  End With
  RetSt = Left$(RetSt, Len(RetSt) - 1)
  Application.ScreenUpdating = True
  Debug.Print RetSt
End Sub

加工前の文字例としては、上(CkSt)のようになるべくいろいろなケースを
交えた方がいいです。なぜなら例文では偶然できたけど、他の文字列で
やってみたら希望の形と違っていた、という可能性が高くなるからです。

【48825】Re:文字の抽出
お礼  なた E-MAIL  - 07/5/10(木) 18:46 -

引用なし
パスワード
   ▼Kein さん:
▼ウッシさん:

本当にありがとうございました。
おかげさまで、やりたい事が完璧に出来ました。

>では、これでどうかな・・?
>
>Sub Check_Data2()
>  Dim Ary As Variant, Ary2 As Variant
>  Dim i As Long, Num As Single
>  Dim C As Range
>  Dim V As String, MyS As String, RetSt As String
>  Const CkSt As String = _
>  "N20,(Z2.4),N20,(Z-6.0),N30,(Z1.0),N20,(Z-3.5),N30,(Z-5.0)"
> 
>  Application.ScreenUpdating = False
>  Range("IT1:IU1").Value = Array("Data1", "Data2")
>  Ary = Split(CkSt, ")")
>  For i = 0 To UBound(Ary) - 1
>   V = CStr(Ary(i)): Ary2 = Split(V, "Z")
>   MyS = Ary2(0)
>   Num = Val(Ary2(1))
>   If Left$(MyS, 1) = "," Then
>     MyS = Right$(MyS, Len(MyS) - 1)
>   End If
>   Cells(i + 2, 254).Value = MyS
>   Cells(i + 2, 255).Value = Num
>   Erase Ary2
>  Next i
>  Range("IT:IU").Sort Key1:=Range("IT1"), Order1:=xlAscending, _
>  Key2:=Range("IU1"), Order2:=xlAscending, Header:=xlYes, _
>  Orientation:=xlSortColumns
>  With Range("IU2", Range("IU65536").End(xlUp)).Offset(, 1)
>   .Formula = "=IF($IT1<>$IT2,$IU2)"
>   For Each C In .SpecialCells(3, 1)
>     RetSt = RetSt & C.Offset(, -2).Value & _
>     "Z" & Format(C.Value, "###.0") & "),"
>   Next
>   '.CurrentRegion.ClearContents
>  End With
>  RetSt = Left$(RetSt, Len(RetSt) - 1)
>  Application.ScreenUpdating = True
>  Debug.Print RetSt
>End Sub
>
>加工前の文字例としては、上(CkSt)のようになるべくいろいろなケースを
>交えた方がいいです。なぜなら例文では偶然できたけど、他の文字列で
>やってみたら希望の形と違っていた、という可能性が高くなるからです。

5797 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free