プロが教えるわが家の防犯対策術!

連投すみません!

前に質問させていただいた内容と少し重複するのですが、マクロが思ったように動いてくれません汗

今、B列にくだものの名前とアルファベットが入っており、A列に1から連番がふってあるとします。そして、B列に果物の名前の入った値のA列は、いったん連番がリセットされ、1に戻されます。

このとき、A列の1から連番の最後までをJ列からN列にかけて3行×5列の表にしたいのですが、写真のコードだと上手く機能しないようです。

コードをいじくってもどうしてもうまくいきません…汗皆様のお知恵を拝借したく思います!

「連投すみません! 前に質問させていただい」の質問画像

A 回答 (4件)

こんばんは!



おそらく前回回答したものです。
前回の配置では数値と数値の間に空白セルが存在していてたと思います。
そのため、あのようなコードにした記憶があります。

お示しのコード内の
>Do While Cells(kRow, "A") <> ""
>myTable(Cells(kRow, "A")) = Cells(kRow, "B")
>kRow = kRow + 1
>iRow = kRow
>Loop

>Do
>myTable(Cells(kRow, "A")) = Cells(kRow, "B")
>If Cells(kRow + 1, "A") <= 1 Then Exit Do
>kRow = kRow + 1
>Loop
に変更してみてください。m(_ _)m
    • good
    • 0
この回答へのお礼

tom04様

お礼が遅れてしまい、大変申しわけありません!!
そうなんです、前は空白が存在していたのですが、今回のは空白が消されているパターンなのです。
いただいたコードで無事上手くいきました!!

そしてDo while 文を私が理解してないということをようやく理解できました笑

最後に根本的なところで一点おききしてもよいでしょうか??

Do myTable(Cells(kRow,)"A") = Cells(kRow, "B")

ここでB列の値がどんどん表にはいっていくのだということはなんとなく分かるのですが、表はA列にはないですよね??
ここでは何をマシンに指示してるのかもしお時間があれば教えていただけないでしょうか??

お礼日時:2016/04/26 09:01

No.1です。


連投ごめんなさい。

投稿後思ったのですが、
ご自身で「3行×5列」と決めていらっしゃいますが、
列数だけ決定すれば行数はあえてこちらで設定しない方法はどうでしょうか?

Sub Sample2()
Dim iRow As Long, kRow As Long, myTable As Range
Dim myMax As Long, myRow As Long
'▼行数を決定
myMax = WorksheetFunction.Max(Range("A:A"))
myRow = WorksheetFunction.RoundUp(myMax / 5, 0) '←5列と決まっている場合の行数設定//★
'▲
For iRow = 1 To Cells(Rows.Count, "B").End(xlUp).Row
If Cells(iRow, "A") = 1 Then
Set myTable = Cells(Rows.Count, "E").End(xlUp).Offset(2).Resize(myRow, 5) '★
kRow = iRow
Do
myTable(Cells(kRow, "A")) = Cells(kRow, "B")
If Cells(kRow + 1, "A") <= 1 Then Exit Do
kRow = kRow + 1
Loop
iRow = kRow
End If
Next iRow
End Sub

これで1ブロックのデータ数がいくつあっても対応できると思います。m(_ _)m
    • good
    • 1
この回答へのお礼

今回は代入しなければならない表のフォーマットが決まっていたのですが、tom04様のお陰でさらに応用の幅が広がりました!!ありがとうございます!

お礼日時:2016/04/26 22:16

続けてお邪魔します。



>最後に根本的なところで一点おききしてもよいでしょうか??

今回の質問ではたまたまA列が数値(連番)なのであのような書き方をしました。
範囲指定したセルの○番目にB列のデータを表示!というコードです。

仮に「りんご」のブロックで見ていくと
Cells(kRow, "A") が 1~10 という連番になりますので、
範囲指定内の「A列のkRow番目」にその行のB列データを!というコトです。

セルを範囲指定し↓のコードでお遊び程度で試してみてください。

Sub Asobi()
Dim cnt As Long, c As Range
For Each c In Selection
cnt = cnt + 1
c = cnt
Next c
End Sub

指定した範囲を横に向かって順に数値が表示されるはずです。
重複しますが
>myTable(Cells(kRow, "A")) = Cells(kRow, "B")
で範囲指定したmyTableの「A列の数値」番目にその行のB列を代入!というコードになります。

この程度でよろしいでしょうか?m(_ _)m
    • good
    • 0

何度もごめんなさい。



お遊びのコードは↓の方が判りやすいと思います。

Sub Acobi2()
Dim i As Long
For i = 1 To Selection.Count
Selection(i) = i
Next i
End Sub

どうも失礼しました。m(_ _)m
    • good
    • 0
この回答へのお礼

tom04様

わざわざご返答いただき本当にありがとうございます。大変よくわかりました!!!

会社での実作業用にはじめてとり組んだVBAですが、tom04様のお力なしには間違いなく完成しなかったと思います。

まさかネットでこんな神様みたいな人に出会えると思っていませんでした…!

重ね重ね御礼申し上げます!!

お礼日時:2016/04/26 22:21

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