• ベストアンサー

Excel(VBA)を活用したマクロについて

ExcelのVBAでマクロを作成していますが、プログラムの壁にぶつかってしまいました。恐れ入りますが、ご回答をお願い致します。 具体的な作業: 30程度のデータをリストボックスに表示させ、必要なデータを選択してもらうプログラムです(ここまではできています)。選択されたデータは作業者にカラーで確認できるようにしましたが、これらの抽出データをバックアップするために、行列を入れ替え「左から右へ詰めて」別シート(Sheet2)へ貼り付けるにはどうすればよいか、アドバイスをお願いします。 お恥ずかしながら、できているところまで掲載させていただきます。 Private Sub データ選択_Click() Dim 数 As Integer If lst一覧.ListIndex = -1 Then  MsgBox "分析するデータを選択してください"  lst一覧.SetFocus Else  For 数 = 0 To lst一覧.ListCount - 1   If lst一覧.Selected(数) = True Then    Cells(20 + 数, 23).Resize(, 8).Interior.ColorIndex = 36    Cells(20 + 数, 23).Resize(, 8).Copy    Sheets("Sheet2").Select Range("ここがわかりません").Select    Selection.PasteSpecial     Paste:=xlPasteFormulas,     Operation:=xlNone,     SkipBlanks:=True,     Transpose:=True    Sheets("Sheet1").Select    Range("A24").Select   End If Next 数 End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.4

元が飛び飛びで貼付けは連続なんだから、貼付ける列の変数をintegrで宣言して 貼り付けるたびに1づつ増やしてやればいいのですよ。 for next をの「数」とは独立してifj条件が成立したときだけ1加算してあげる dim 貼付け列 as integer ifの次の行に 貼付け列=貼付け列+1 '一列目から開始するとき Range("ここがわかりません").Selectを cells(1,貼付け列).select '1行目から貼り付けるとき (貼付けは範囲指定しなくて先頭のセルを選択すればいいと思います) resize なんてはじめてみた今までRangeでしか使ったことがない。 人のコードを見るのって面白いですね。

YT06
質問者

お礼

rivoisuさん、初心者の私にも大変わかりやすいご説明、ありがとうございました。理想の作業ができるようになりました。勉強になります。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

何回コピーをしたのかのカウンタがあれば事足りそうですが ・・・ Dim nDestColumn as Integer といった具合に変数を用意して ループに入る前に nDestColumn = 1 と初期化しておく Range("ここがわかりません").Selectを Cells( 1, nDistColun ).Select Selection.Pastespetial ... # 引数省略 nDistColumn = nDistColumn + 1 といった具合で出来そうですが ・・・

YT06
質問者

お礼

ご回答ありがとうございました。カウンタの考え方…と思いながらも、どうすればよいかわからずでした。助かりました。ありがとうございました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

私も >Range("ここがわかりません").Select の意味がわかりません 私は「左から右へ詰めて」に拘ってみます  A B C D E 1 a  b  c 2 この様なとびとびのデータを  A B C D E 1 a 2 b 3 c この様にしたいのでは、と思うので >Cells(20 + 数, 23).Resize(, 8).Copy を Cells(20 + 数, 23).Resize(, 8).SpecialCells(xlCellTypeConstants, 23).Copy として >Range("ここがわかりません").Select は、条件が分らないので Range("A1").Select と、仮で変更してみてください 参考まで

YT06
質問者

お礼

早速のご回答,ありがとうございました。説明が不足して申し訳ありません。もう少し補足させてください。「Sheet1で表示されるリストボックスから複数の項目を選択し,その行に関するデータをコピーして,Sheet2にペーストする」という作業です。ランダムに選択した行を,下記のように行列を入れ替えて,右詰で表示させたいと考えています。 リストボックス上で1番と4番を選択すると,1行目と4行目をコピー。  A B 1 a b 2 3 4 c d そして,シート2に移動し,以下のようにペースト。  A B 1 a c 2 b d hige_082さんのプログラム,早速活用させていただきましたが,ペースト先が「Range("A1").Select」と一点であるため,次々と同じセルに上書きされた状態となってしまいました。 もう一度検討してみます。ありがとうございました。

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

すみません。あまりよくコードも読まずに回答しますが >Range("ここがわかりません").Select> 範囲選択で開始セル(左上のセル)、と終了セル(右下のセル)のそれぞれの行列から範囲選択をするにはどうすればいいかという質問かなと思いました。 マクロ記録や、簡単な解説書にはrange("B2:F20")という表現になるので悩んでるのかなぁと こういう場合は Range(Cells(開始行,開始列),Cells(終了行,終了列)).Select つまりrange("B3:F20")は Range(Cells(3,2),Cells(20,6))となります。 同様に下から5行目のRange("A24").Selectは Cells(24,1).select とします。 これでいいのかなぁ

YT06
質問者

お礼

ご回答ありがとうございました。 実は当初,ペースト先「Range("ここがわかりません").Select」をセル番号で指定していたのですが,コピーするデータがとびとびの行でして,ペースト先もこれに準じてとびとびで貼り付け作業を行うようでしたので,ご相談させて頂きました。 データを一息にコピーするのであれば「空白セルを無視する」という方法が考えついたのですが,一行ずつの転写だったので,左詰がうまくいきませんでした。またお時間がありましたら,アドバイスお願い致します。ありがとうございました。

関連するQ&A