Excel VBA質問箱 IV

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

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


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

【20281】空白を含む1つの長いデータを分割したい 初心者です 04/12/4(土) 12:16 質問[未読]
【20282】Re:空白を含む1つの長いデータを分割したい かみちゃん 04/12/4(土) 12:27 発言[未読]
【20294】Re:空白を含む1つの長いデータを分割したい Kein 04/12/4(土) 14:57 回答[未読]
【20299】Re:空白を含む1つの長いデータを分割し... 初心者です 04/12/4(土) 17:42 質問[未読]
【20304】Re:空白を含む1つの長いデータを分割し... かみちゃん 04/12/4(土) 19:07 回答[未読]
【20309】Re:空白を含む1つの長いデータを分割し... Kein 04/12/4(土) 23:37 回答[未読]
【20318】Re:空白を含む1つの長いデータを分割し... 初心者です 04/12/5(日) 13:13 お礼[未読]

【20281】空白を含む1つの長いデータを分割したい
質問  初心者です  - 04/12/4(土) 12:16 -

引用なし
パスワード
   次のような個人の買い物データがエクセルのA1にはいっています。

100120   34  21

ここで、100はコード番号、120はりんごの購入数、次の3けたの空白はみかんの購入数ですが、この人はみかんを購入しなかったためデータ上空白、34は栗の購入数、次の2けたの空白は大根の購入数ですが、この人は大根を購入しなかったため空白、最後の21はきゅうりの購入数です。これを、マクロを使ってA1からA6のセルに分割する形で書き換えたいのですが、どうすればよいでしょうか。

 A1   A2   A3   A4   A5   A6
100  120        34       21

実際のデータは数百人のデータなので、とても手で対応するわけにいきません。なにかよい方法があれば教えていただけないでしょうか。よろしくお願いします。

【20282】Re:空白を含む1つの長いデータを分割し...
発言  かみちゃん  - 04/12/4(土) 12:27 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ここで、100はコード番号、120はりんごの購入数、次の3けたの空白はみかんの購入数ですが、この人はみかんを購入しなかったためデータ上空白、34は栗の購入数、次の2けたの空白は大根の購入数ですが、この人は大根を購入しなかったため空白、最後の21はきゅうりの購入数です。これを、マクロを使ってA1からA6のセルに分割する形で書き換えたいのですが、どうすればよいでしょうか。

コード番号   3桁
りんご購入数  3桁
みかん購入数  3桁
栗購入数    2桁
大根購入数   2桁
きゅうり購入数 2桁
ということでいいのでしょうか?
たとえば、りんごの購入数が120ではなく90だと「△90」(△はスペース)
などということになりますか?
また、りんご購入数が1000以上になることはないということでいいでしょうか?

これらの前提であれば、MID関数や、「データ」−「区切り位置」でできます。

【20294】Re:空白を含む1つの長いデータを分割し...
回答  Kein  - 04/12/4(土) 14:57 -

引用なし
パスワード
   A列の値を全て 3,3,3,2,2,2 の文字数で分割して AA1 から表示するとして

Columns(1).Parse "[xxx][xxx][xxx][xx][xx][xx]", Range("AA1")

というコードで出来ます。なので

MyV = Range("AA1:AF1").Value
Sheets("Sheet2").Range("A1:A6").Value = _
WorksheetFunction.Transpose(MyV)

とすれば、シート2へ行列変換して入力できますが、AA2 以下に分割入力してある
データは、どこへ持っていけばいいのでしょーか ?
>実際のデータは数百人
となると、列数が足りないから A7 以下の1列に繋げて入力するのでしょーか ?

Dim C As Range
Dim MyV As Variant
Dim i As Long

Columns(1).Parse "[xxx][xxx][xxx][xx][xx][xx]", Range("AA1")
i = 1
For Each C In Range("AA1", Range("AA65536").End(xlUp))
  MyV = C.Resize(, 6).Value
  Sheets("Sheet2").Cells(i, 1).Resize(6).Value = _
  WorksheetFunction.Transpose(MyV)
  i = i + 6
Next
Range("AA:AF").ClearContents

【20299】Re:空白を含む1つの長いデータを分割し...
質問  初心者です  - 04/12/4(土) 17:42 -

引用なし
パスワード
   かみちゃんさん、Keinさんさっそくのお返事ありがとうございます。Keinさんの    

Columns(1).Parse "[xx][xxx][xxx][xx][xxx][xx][xx]", Range("AA1")    

を試してみたら、うまく機能することがわかりました。Sheet2への移動なども参考になりました。    

しかし実をいうと実際のデータは「りんご、みかん、栗、大根、きゅうり」の5品目ではなく、200品目ぐらいあります。そのため、上に書いたように、ひとつづつ[xx]で表示するのは少し難しい状況です。その場合、Keinさんのような方法を応用してうまくできないでしょうか。    

また、かみちゃんさんの質問で、りんごの個数が90の場合、データでは「090」としるされています。1000以上のことはありません。

レベルの低い質問ですみませんが、わかれば教えてください。よろしくお願いします。

【20304】Re:空白を含む1つの長いデータを分割し...
回答  かみちゃん  - 04/12/4(土) 19:07 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>しかし実をいうと実際のデータは「りんご、みかん、栗、大根、きゅうり」の5品目ではなく、200品目ぐらいあります。そのため、上に書いたように、ひとつづつ[xx]で表示するのは少し難しい状況です。その場合、Keinさんのような方法を応用してうまくできないでしょうか。    

区切り位置の桁が固定されているということですので、次のような感じでできると
思います。

Option Explicit

Sub Macro1()
  Dim strFieldInfo As String
  Dim i As Integer
  
  'フィールドの区切り位の編集
  strFieldInfo = ""
  For i = 1 To 200
   Select Case i
    Case 1 To 3 'コード、りんご、みかん … 3桁の場合
     strFieldInfo = strFieldInfo & "[xxx]"
    Case 4 To 6 '栗、大根、きゅうり … 2桁の場合
     strFieldInfo = strFieldInfo & "[xx]"
    Case ...
    End Select
  Next
  'データを区切る 区切った後は、B2から横に展開されます。
  Columns(1).Parse strFieldInfo, Range("B2")
End Sub

【20309】Re:空白を含む1つの長いデータを分割し...
回答  Kein  - 04/12/4(土) 23:37 -

引用なし
パスワード
   先と同様に、Sheet2のA列に転記するとして

Sub Sp_Data()
  Dim nmAry As Variant, spAry(8) As String
  Dim i As Long, j As Long
 
  nmAry = Array(3, 3, 3, 2, 2, 2, 3, 3, 3)
  j = 1
  For i = 0 To 8
   spAry(i) = Mid$(Range("A1").Value, j, nmAry(i))
   j = j + nmAry(i)
  Next i
  Sheets("Sheet2").Range("A1").Resize(9).Value = _
  WorksheetFunction.Transpose(spAry())
  Erase nmAry, spAry
End Sub

これは9個に分割するという前提のコードですが、実際には nmAry には、200個分の
文字数を表す要素を書かなければなりません。
カンマの後ろに半角スペースと行継続文字を入れて、複数行の要素を記述して下さい。
そして spAry(199) As String と宣言し、For i = 0 To 199 とカウンタの上限を
「分割する数 - 1 」に変更します。
>Sheets("Sheet2").Range("A1").Resize(9).Value
のところは、分割する数と一致した行数を Resize の引数に渡します。つまり
.Resize(200) になるわけです。
さらに、A列に並んだデータを連続して処理するなら

Sub Sp_Data2()
  Dim nmAry As Variant, spAry(8) As String
  Dim i As Long, j As Long
  Dim C As Range
 
  nmAry = Array(3, 3, 3, 2, 2, 2, 3, 3, 3)
  For Each C In Range("A1", Range("A1").End(xlDown))
   j = 1
   For i = 0 To 8
     spAry(i) = Mid$(C.Value, j, nmAry(i))
     j = j + nmAry(i)
   Next i
   Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1) _
   .Resize(9).Value = WorksheetFunction.Transpose(spAry())
   Erase nmAry, spAry
  Next
End Sub

ということになりますが、シートの終端行を超えて入力することは出来ないから、
300行ぐらいが限界と考えて下さい。

【20318】Re:空白を含む1つの長いデータを分割し...
お礼  初心者です  - 04/12/5(日) 13:13 -

引用なし
パスワード
   かみちゃんさん、Keinさんありがとうございます。
アドバイスのおかげで、なんとか対応できそうです。

またわからないことがあったときには質問させていただきますので、そのときはよろしくお願いします!

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