アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなデータ(列数も行数も常に変わり、固定ではない)を

┌─────────────────
│ A 列  | B列   | C列   | D列
├───────────────────
│ 1 │伝票01 │品名01 | 品名02 │品名03
├───────────────────
| 2 │0011 │みかん │みかん | りんご
├───────────────────
│ 3 │1001 │りんご  │いちご |   
├───────────────────
│ 4 │1100 │いちご  │みかん | ぶどう 
└───────────────────

↓のように2列にまとめる方法はございますでしょうか?VBAを希望しております。
  よろしくお願い申し上げます。

┌─────────────────
│ A │ B  
├─────────────────
│ 1 │伝票  │品名
├─────────────────
│ 2 │0011_品名01 │みかん 
├─────────────────
│ 3 │1001_品名01 │りんご   
├─────────────────
│ 4 │1100_品名01 │いちご
├─────────────────
│ 5 │1001_品名02 │みかん 
├─────────────────
│ 6 │1100_品名02 │いちご 
├─────────────────
│ 7 │1001_品名02 │みかん 
├─────────────────
│ 8 │1100_品名03 │りんご 
├─────────────────
│ 9 │1001_品名03 │ 
├─────────────────
│ 0 │1001_品名03 │ぶどう 
├─────────────────

A 回答 (3件)

作成例:


sub macro1()
 dim h as range
 dim Target as range
 dim n as long
 dim w as worksheet

’準備
 set w = activesheet
 set target = w.range("A1").currentregion.offset(1,1)
 worksheets.add after:=activesheet
 range("A1:B1") = array("伝票","品目")
 n = 1

’転記
 for each h in target
 if h <> "" then
  n = n + 1
  cells(n, "A") = w.cells(h.row,1).text & "," & w.cells(1, h.column).value
  cells(n, "B") = h.value
 end if
 next
end sub
    • good
    • 0
この回答へのお礼

keithin 様

下手な質問文だったと思いますが、お察しいただき恐縮です。
おかげさまで、やりたいことができました。
また早々のご回答をいただき大変助かりました、誠にありがとうございました。

お礼日時:2011/11/01 13:15

>2列にまとめる方法はございますでしょうか?VBAを希望しております。


 ⇒期待値として5行目以降の平仄が合っていないのではないでしょうか。
  VBAの知識がないのであれば丸投げ質問は、回答後に変更が発生したら対応が
  とれないので、VBAを学習してから質問した方が良いと思う。

  因みに2列の統合ですが以下の様な構成もありと思いますが如何でしょうか。
   伝票1_品名1/品名1
   伝票1_品名2/品名2
   伝票1_品名3/品名3
   伝票2_品名1/品名1
   伝票2_品名2/品名2
    ~
   (空白は対象外)
   伝票n_品名m/品名m

 コード例ですが、2つのループ処理でデータの転記が可能です。
  For 行 = 2 To 列最終行
   For 列 = 2 To 行最終列
    データ転記
   NEXT 列
  Next 行
    • good
    • 0
この回答へのお礼

mu2011 様

ご指摘ありがとうございます。
自分ができる範囲で作ったコードを載せた方が良かったですね!すみません。
また、ご提案もありがとうございます、参考にさせていただきます。

お礼日時:2011/11/01 13:10

品名の数が各行で一定数なら、エクセル関数の組み合わせで、できると思う。


しかし不定個数のようだから、関数では複雑になる。質問者は何処まで勉強して考えてやってみたのか。
ーー
VBAでやれば素直な問題なので、書いておく。
こういう風に、データの組み換えなどしたくなったら、VBAは必須だというのが私の持論。
例データ A1:D4  
伝票01品名01品名02品名03
0011みかんみかんりんご
1001りんごいちご
1100いちごみかんぶどう
(注)質問に丁寧に縦棒横棒で書いているが、こういう書き方(シートのセル範囲のコピペ)で、質問者に判るのでは
結果
J2:K9
0011品名01みかん
0011品名02みかん
0011品名03りんご
1001品名01りんご
1001品名02いちご
1100品名01いちご
1100品名02みかん
1100品名03ぶどう
ーー
コードは
標準モジュールに
Sub test01()
d = Range("A65536").End(xlUp).Row
k = 2
For i = 2 To d
r = Cells(i, "I").End(xlToLeft).Column
For j = 2 To r
Cells(k, 10) = Cells(i, "A") & Cells(1, j)
Cells(k, 11) = Cells(i, j)
k = k + 1
Next j
Next i
End Sub
(注意)
同じシートのJ列から結果を出している。従って元データはI列までと仮定。そうでない場合1部手直しが必要。
他シートに結果を出すのは一部手直しが必要。
(VBAの回等が、質問者の意に沿うかどうか判らないので手抜き。)
    • good
    • 0
この回答へのお礼

imogashi様

for~next のネストはまだまだ組み立てるのが苦手なので大変勉強になりました。
丁寧なご回答いただき、ありがとうございました。

お礼日時:2011/11/01 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!