Excel VBA質問箱 IV

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

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


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

【58702】1つセルの中身を2セルに分けるには 08/11/5(水) 14:32 質問[未読]
【58703】Re:1つセルの中身を2セルに分けるには 08/11/5(水) 14:50 発言[未読]
【58705】Re:1つセルの中身を2セルに分けるには りった 08/11/5(水) 15:08 回答[未読]
【58706】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 15:33 発言[未読]
【58707】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 15:35 発言[未読]
【58708】Re:1つセルの中身を2セルに分けるには 08/11/5(水) 16:50 質問[未読]
【58712】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 18:33 発言[未読]
【58714】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 18:50 発言[未読]
【58715】Re:1つセルの中身を2セルに分けるには 08/11/5(水) 19:21 質問[未読]
【58716】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 19:37 発言[未読]
【58717】Re:1つセルの中身を2セルに分けるには 08/11/5(水) 20:04 質問[未読]
【58719】Re:1つセルの中身を2セルに分けるには kanabun 08/11/5(水) 21:02 発言[未読]
【58738】Re:1つセルの中身を2セルに分けるには 08/11/6(木) 11:44 質問[未読]
【58740】Re:1つセルの中身を2セルに分けるには kanabun 08/11/6(木) 11:51 発言[未読]
【58745】Re:1つセルの中身を2セルに分けるには 08/11/6(木) 13:54 お礼[未読]

【58702】1つセルの中身を2セルに分けるには
質問    - 08/11/5(水) 14:32 -

引用なし
パスワード
   こんにちは。
ファイルAのG列に
2行目に「AADDKK03 りんご」(3とリの間はブランク)
3行目に「MDK05 みかん」(5とみの間はブランク)
・・・というふうに入っているとします。

いま、ファイルBに、
2行目F列に「AADDKK03」
2行目G列に「りんご」、
3行目F列に「MDK05」
3行目G列に「みかん」
・・・、というふうに、マクロで入れていくにはどういうロジックをくめばいいでしょうか。

質問がわかりづらくてすみません。

【58703】Re:1つセルの中身を2セルに分けるには
発言    - 08/11/5(水) 14:50 -

引用なし
パスワード
   ▼に さん:
マクロの記録を使うと良いです。

ファイルAのG列をファイルBのF列にコピー
ファイルBのF列を「(データ)-(区切り位置)」にて区切る

この一連を記録しましょう。

区切るときは、「カンマやタブ・・・」を選択し、
区切り記号を「 」半角スペース(?)にしておくと良いです。

【58705】Re:1つセルの中身を2セルに分けるには
回答  りった  - 08/11/5(水) 15:08 -

引用なし
パスワード
   ブランクで区切って、コピー元1セルをコピー先2セルに分けてコピーするってことですよね?

とりあえず必要そうな関数等を記載しておきます。

for
InStr
Left
Right
Len

後は気合だと思います。
とりあえず頑張ってみてムリそうだったら根をあげましょう。

【58706】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 15:33 -

引用なし
パスワード
   ▼に さん:

おじゃまします。

Excel2000以降なら、スペースで文字列を分割できるから、
こんな方法(配列内で処理)も可能です。

Sub Try1()
  Dim v, t
  Dim i As Long
  
  With Workbooks("ファイルA").Worksheets(1)
    v = .Range("G2", _
      .Cells(.Rows.Count, "G").End(xlUp)).Resize(, 2).Value
  End With
  For i = 1 To UBound(v)
    t = Split(v(i, 1))
    v(i, 1) = t(0)
    v(i, 2) = t(1)
  Next
  With Workbooks("ファイルB").Worksheets(1)
    .UsedRange.ClearContents
    .Range("F2").Resize(UBound(v), 2).Value = v
  End With
 
End Sub

【58707】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 15:35 -

引用なし
パスワード
   補足です

>  With Workbooks("ファイルA").Worksheets(1)

Book名には 拡張子xlsをつけてください

With Workbooks("A.xls").Worksheets(1)

とか。

【58708】Re:1つセルの中身を2セルに分けるには
質問    - 08/11/5(水) 16:50 -

引用なし
パスワード
   ▼みなさま、kanabun さん:
ありがとうございます。
一瞬できたと思ったのですが、

    v(i, 2) = t(1)
でエラーになります。インデックスが有効範囲にない、と出ます。
なにがいけないでしょうか。
拡張子はちゃんと付けました。
どうかご教示ください。

【58712】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 18:33 -

引用なし
パスワード
   ▼に さん:

>一瞬できたと思ったのですが、
>
>    v(i, 2) = t(1)
>でエラーになります。インデックスが有効範囲にない、と出ます。
>なにがいけないでしょうか。

Split関数は スペースが一つ以上含まれたセルデータに対して
  t = Split("MDK05 みかん")
を実行しますと、データはスペースで 前後に分割され、
  t(0) に "MDK05" が
  t(1) に "みかん" が
代入されます。

スペースが一つもないセルデータですと
  t = Split("ANBCDE")
の結果は、分割されずに、
  t(0) = "ANBCDE"

のようになるだけです。
したがって、そういうデータ(スペースを含まないデータ)があるならば、
代入は(0)で終了する必要があります。

変数 j を追加して
  Dim j as long

For〜 Next のところを

  For i = 1 To UBound(v)
    t = Split(v(i, 1))
    v(i, 2) = 0
    For j = 0 to UBound(t)
      v(i, j + 1) = t(j)
    Next
  Next

とでもしてみると、どうなりますか?

【58714】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 18:50 -

引用なし
パスワード
   ▼に さん:

↑のばあい、スペースが1つもないことには対応しましたが、
逆のケース スペースが2か所以上ある場合に、またエラーになります。
そこで、見検証ですが、こうしてください。

Sub Try2()
  Dim v, t
  Dim i As Long
  Dim j As Long
  
  With Workbooks("A.xls").Worksheets(1)
    v = .Range("G2", _
      .Cells(.Rows.Count, "G").End(xlUp)).Resize(, 2).Value
  End With
  For i = 1 To UBound(v)
    t = Split(v(i, 1), " ", 2) '最初のスペースで 前後に分割する
    For j = 0 To UBound(t)
      v(i, j + 1) = t(j)
    Next
  Next
  With Workbooks("B.xls").Worksheets(1)
    .Columns("F:G").ClearContents
    .Range("F2").Resize(UBound(v), 2).Value = v
  End With
 
End Sub

【58715】Re:1つセルの中身を2セルに分けるには
質問    - 08/11/5(水) 19:21 -

引用なし
パスワード
   ▼kanabun さん:

まさに2つスペースのケースがありました。
おそれいりました。

>    t = Split(v(i, 1), " ", 2) '最初のスペースで 前後に分割する

これですと右から数えて最初のスペース になっていませんでしょうか。
左から数えて最初のスペース にするのはどうすればよろしいでしょうか。

【58716】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 19:37 -

引用なし
パスワード
   ▼に さん:
>▼kanabun さん:
>
>まさに2つスペースのケースがありました。
>おそれいりました。
>
>>    t = Split(v(i, 1), " ", 2) '最初のスペースで 前後に分割する
>
>これですと右から数えて最初のスペース になっていませんでしょうか。
>左から数えて最初のスペース にするのはどうすればよろしいでしょうか。

その構文で、
「左から数えて最初のスペース」

という意味です。

【58717】Re:1つセルの中身を2セルに分けるには
質問    - 08/11/5(水) 20:04 -

引用なし
パスワード
   ▼kanabun さん:
ううむ、
右から数えて最初のスペース で2つに分割されるのですが、、。
もう一度たしかめてみます。

【58719】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/5(水) 21:02 -

引用なし
パスワード
   ▼に さん:
>▼kanabun さん:
>ううむ、
>右から数えて最初のスペース で2つに分割されるのですが、、。
>もう一度たしかめてみます。

↓こんな簡単な例で確かめてください。

Sub Check()
 Dim ss$
 Dim t
 
 ss = "abc 123 あいう XYZ"

 t = Split(ss, " ", 2, vbTextCompare)
 MsgBox t(0) & vbCr & t(1)
 
End Sub

【58738】Re:1つセルの中身を2セルに分けるには
質問    - 08/11/6(木) 11:44 -

引用なし
パスワード
   ▼kanabun さん:
ちょっとりゆうがわかってきました。
わたしのデータの、左から数えて最初のプランクは、「全角スペース」でした。
左から数えて最初「全角スペース」で2分割することは可能でしょうか?

【58740】Re:1つセルの中身を2セルに分けるには
発言  kanabun  - 08/11/6(木) 11:51 -

引用なし
パスワード
   ▼に さん:
>▼kanabun さん:
>ちょっとりゆうがわかってきました。
>わたしのデータの、左から数えて最初のプランクは、「全角スペース」でした。
>左から数えて最初「全角スペース」で2分割することは可能でしょうか?

▼全角スペースだけを分割の対象にしたいのなら、
 それはもう
   t = Split(v(i, 1), " ", 2) '最初の全角スペースで 前後に分割する
とするだけで、簡単なことですが。


▼全角半角を問わず最初のスペースで分割したいときは、

> t = Split(v(i, 1), " ", 2) '最初のスペースで 前後に分割する

のところを
先のレスにあるように、

  t = Split(v(i, 1), " ", 2, vbTextCompare)

とすると、
 全角半角を問わず最初のスペースで分割してくれます。

【58745】Re:1つセルの中身を2セルに分けるには
お礼    - 08/11/6(木) 13:54 -

引用なし
パスワード
   ▼kanabun さん:
vbTextCompareを付けたらできました!
これで大きく前進です。
本当にありがとうございました。

にしもり

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