Excel VBA質問箱 IV

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

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


10679 / 13644 ツリー ←次へ | 前へ→

【20385】文字列の操作について 初心者 04/12/7(火) 21:51 質問[未読]
【20386】Re:文字列の操作について Kein 04/12/7(火) 22:40 回答[未読]
【20390】Re:文字列の操作について ちゃっぴ 04/12/8(水) 0:29 回答[未読]
【20428】Re:文字列の操作について 初心者 04/12/8(水) 22:42 質問[未読]
【20459】Re:文字列の操作について Hirofumi 04/12/9(木) 21:15 回答[未読]
【20462】Re:文字列の操作について Hirofumi 04/12/9(木) 21:37 回答[未読]

【20385】文字列の操作について
質問  初心者  - 04/12/7(火) 21:51 -

引用なし
パスワード
   いつも参考にさせて頂いています。

   A                     B   C
  備考                    1月  2月
05/01 1050 05/02 32.50            
05/01 500 05/02 8200 05/03 25.33
交渉中
05/01 322.50 05/02 3100 05/03 870
   ・
   ・(700行ほどあります)
   ・
A列に上のような項目が入力されています。05年1月、05年2月、05年3月の単価なのですが、単価をB列、C列にそれぞれ抜き出すマクロを作りたいのですが、ブランクのセルもあり、また「交渉中」と言ったコメントのみのセルもあります。またひと月分しか単価のセルや3ヶ月分入っているセルもあり規則性がありません。例えば05/01(スペース)のあとから次のスペースまでを抜き出し、1月に貼り付けるマクロなど出来るでしょうか?
何か良い方法があればご指導ください。
どうぞよろしくお願いします。

【20386】Re:文字列の操作について
回答  Kein  - 04/12/7(火) 22:40 -

引用なし
パスワード
   Split関数でスペースを区切りとして、配列を作ればよいでしょう。

【20390】Re:文字列の操作について
回答  ちゃっぴ  - 04/12/8(水) 0:29 -

引用なし
パスワード
   >Split関数でスペースを区切りとして、配列を作ればよいでしょう。

そのあとに、配列をLoopして"05/01"という文字列があったら、
次の番号をセルに代入とかしてやればいいでしょうね。

Select Case vntArray(i)
  Case "05/01"
    Cells(j, 2).Value = vntArray(i + 1)
End Select

【20428】Re:文字列の操作について
質問  初心者  - 04/12/8(水) 22:42 -

引用なし
パスワード
   返信ありがとうございます。
Split関数は聞いたことがありませんでした。インターネットで調べてみたのですが、実例が見つからず、どのように使って良いかわかりません。お手数ですが、何か実例を教えて頂けると助かります。どうぞよろしくお願いします。
▼Kein さん:
>Split関数でスペースを区切りとして、配列を作ればよいでしょう。

【20459】Re:文字列の操作について
回答  Hirofumi  - 04/12/9(木) 21:15 -

引用なし
パスワード
   こんなかな?

Option Explicit

Public Sub Extraction()

  Dim i As Long
  Dim vntResult As Variant
  
  With ActiveSheet
    For i = 2 To .Cells(65536, "A").End(xlUp).Row
      vntResult = UnitPrice(.Cells(i, "A").Value)
      .Cells(i, "B").Resize(, UBound(vntResult)).Value = vntResult
    Next i
  End With
    
End Sub

Private Function UnitPrice(ByVal vntLine As Variant) As Variant

  Dim i As Long
  Dim vntData() As Variant
  Dim lngPos As Long
  Dim lngRead As Long
  Dim vntTmp As Variant
  Dim lngLineLen As Long
  
    
  vntLine = Trim(vntLine)
  lngLineLen = Len(vntLine)
  
  lngRead = 1
  i = 0
  ReDim vntData(1 To 1)
  Do Until lngRead > lngLineLen
    lngPos = InStr(lngRead, vntLine, " ", vbTextCompare)
    If lngPos = 0 Then
      vntTmp = Mid(vntLine, lngRead)
      lngRead = lngLineLen + 1
    Else
      vntTmp = Mid(vntLine, lngRead, lngPos - lngRead)
      lngRead = lngPos + 1
    End If
    If IsNumeric(vntTmp) Then
      i = i + 1
      ReDim Preserve vntData(1 To i)
      vntData(i) = vntTmp
    End If
  Loop
  
  UnitPrice = vntData
  
End Function

【20462】Re:文字列の操作について
回答  Hirofumi  - 04/12/9(木) 21:37 -

引用なし
パスワード
   あ!、言い忘れたけど

05/01 322.50 05/02 3100 05/03 870

こう言うデータなら善いけど

05/01 322.50 05/03 870

こう言うデータの場合、3月が2月の位置に成ります
単純に、数値データを前に送っているだけですので
もし、この様なデータで、3月は3月の位置に抜き出すとすると
もう少し、複雑なコードに成ります
様は、列の見出しを、「05/01」、「05/02」、「05/03」の様にして
Matchi等で探す様ですね

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