• ベストアンサー

エクセルのマクロ中で

飛び飛び(ctrl+クリック)で選択された値を 別シートに貼り付けるマクロを作成中です。  元はD列にある値なのでRange("D" & cnt)として (cntは変数)  cnt = Selection.Row.Countで行番号を取得しようと しましたがうまくいきません。 D1から順番に縦方向に最終データまでは行けるのですが ・・・  初心者に「産毛」が生えたくらいです。ご教授お願いします

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.9

Sub sample5() Dim r As Range Dim Ary As Variant Dim sh As Integer, i As Integer '記入したいシート名を、記入順に書く Ary = Array("データシート", "整理後", "整理後") sh = LBound(Ary) i = 8 For Each r In Selection Worksheets(Ary(sh)).Range("E" & i) = r If i = 26 Then i = 8 '記入位置の初期化 sh = sh + 1 'シート名のカウントアップ If sh > UBound(Ary) Then Exit For Else i = i + 2 End If Next End Sub で、どうかな? 転記をするには、 1.どのシートからどのシートへ転記するか? 2.元のデータをどう取得するか? 3.転記位置をどう指定するか? を、きちんと分けて考えて、実現可能な順番や手法を考えて纏めなくてはいけません。 自分で作ったサンプルを書いてくれるのは嬉しいですが、質問文やプログラムから「前提条件」が読みとれない場合、質問された部分に付いての回答しかできませんからね。 これからもがんばってくださいね。 下記サイトがいろいろと参考になると思いますよ。

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/index.html,http://www.moug.net/index.htm
yanyanyanyan
質問者

お礼

ありがとうございました。 質問の仕方については「すみませんでした」の一言に尽きると思います。 お二方のサンプルは両方試してみます。 短時間でこのようなサンプルを作れるスキルには 驚愕の思いです。 自学自習ですのでまたこのような質問をするかと 思いますがそのときはひとつよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.8

#7の補足を読んで、当初の質問で無かったことが出てきていますね。質問の表現を考えてもらわないと回答者泣かせですよ。私流にまとめると (1)元シートのD列のセルを範囲指定する。CTRLキーを押して範囲指定するので、飛び飛びの範囲を指定することもあり得る。 (2)これを他のシートのE1:E32に詰めて貼りつける(セルにデータをセット)するが、一杯になると、別シートのE1:E32にデータをセットし、オーバーしたら 別シートに順次繰り返す。 >Ctrl+Shiftで選択し この意味はなんですか?CTRLキーだけでは。 ------- (1)元シートで、CTRLうお押して選択するので Dim cl As Range For Each cl In Selection '(処理) Next をぜひ使いたい。 >cnt = Selection.Row.Countで行番号を取得しようと しましたがうまくいきません。 ややこしい道に入ってしまう。 (2)しかし「処理」の中で、1シートでオーバーフローしたら、シートを別のシートに行かなければならない 。その時も Dim sh As Worksheet For Each sh In ActiveWorksheet.Worksheets '(処理) Next を使いたいが、 For Each は「ネスト使用はできない」。 (3)それでシートのIndexを使う。 -----私流のコードをご参考に MsgBoxは確認用で、適宜削除してください。 Sub test01() Dim cl As Range s = 1 'シートのインデックス i = 1 '第1行目 sc = Sheets.Count: MsgBox sc ms = Worksheets("Sheet1").Index: MsgBox ms cnt = Selection.Rows.Count: MsgBox cnt For Each cl In Selection If s = ms Then s = s + 1 '次は、次のシートに i = 1 '次は、次のシートの第1行目に End If Worksheets(s).Cells(i, "E") = cl i = i + 1 '次は、E列次行へセット If i > 32 Then s = s + 1 '次は、次のシートに i = 1 '次は、次のシートの第1行目に End If Next End Sub 簡単なテストは済み。 シートセット順序はシートタブの左から。 これを変えるならVBAで変える方法もあります(略)。 取りあえず手動で良いように並べてください。 元シートはSheet1と仮定。適宜修正のこと。 元シートは一番左がよいかな。中間でも可と思うが。 元シートをアクチブにしてVBAを実行のこと。 sc*32>cntなどのチェックは省略してます。

yanyanyanyan
質問者

お礼

おかげさまで何とかなりました 何度も何度もすみませんでした。 当初は自分の書いたマクロの足りないところを 埋めたくて質問させていただきました。 すべてを頼るのは今後の勉強にならないのでは?という 気持ちがあったからです。結果皆さんを混乱させたことをお詫びします。 まだまだ実務レベルには到底届きませんがお二人の サンプルを参考にしてやっとおもしろくなったマクロを 極めたいと思います(無理かなぁw)

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.7

>For Each ws In Worksheets If (ws.Name <> "データシート") And ~ AndではIf文全体の条件が成立しません。 ws.Name で得られるのは、for Each ループ1回で1つの名前だけです。 なので、複数の ws.Name が書かれていても、全ての値は同じワークシート名になります。 And ではなく Or にする必要があるかと思います。 前提が解りませんが・・・(ws.Name = "データシート") にして、実行したいシート名の方が良いかと思います。 XX以外なら実行~と指定するのと、○○なら実行~と指定する場合、どちらの方が数が少ないのでしょう?

yanyanyanyan
質問者

補足

重ね重ねすみません。 話を整理します。 データシートの「D列」にあるデータをCtrl+Shiftで 選択し、それを「あ」シートのRange("E" & i) から 一行おきに("E"&32)間に貼り付けデータ数が("E"&32)を 越えた場合、次の「い」シートのRange("E" & i)へ・・・ Ctrl+Shiftで選択したデータがなくなったら終了。 貼り付けたくないシートがあるので If (ws.Name <> "データシート") で除外しようと思ったのですが。。。。

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.6

Sub sample3() Dim r As Range Dim ws As Worksheet, i As Integer For Each ws In Worksheets If (ws.Name <> "データシート") Then i = 14 For Each r In Selection.Areas ws.Range("E" & i) = Worksheets("データシート").Range("D" & r.Row) If i = 32 Then Exit For Else i = i + 2 End If Next End If Next End Sub 一部誤りがありましたので修正します。 >For i = 14 To 32を満たすまで とは、下記の形式ですか? For i=14 ~ 記入場所を指定 For Each ~ 全ての指定範囲を取り出す Next Next つまり、指定された記入場所(i)に全ての指定範囲の値(r.row)を書き込んで終了します。 つまり、セルに残るのは最後に取り出された範囲の値になります。 For Each 文は、1.2.3.4.5~と連続で値を取り出す事が可能ですが、3で抜けて再度ループに入っても、次回も1.2.3.4~と同じ順番で取り出す事しかできません。 4から取り出すなら、変数に3を格納し、if文で判定する必要があります。 (実行速度の無駄になりますが・・・。) なので、途中で抜ける場合は「目的の処理が終わった時」にするのがベストだと思います。 つまり、今回のようにループ中に For Each 文を入れた場合、目的とする処理結果を得ることはできません。

yanyanyanyan
質問者

お礼

たびたびありがとうございます。 ん~~時間掛けて理解してもいいですか(^_^; 「言葉」をマクロに翻訳するのはなかなか難しい ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#3です。 Sheet1と同じ位置のセルにコピーしたい場合 Sub test01() Dim cl As Range For Each cl In Selection r = cl.Row c = cl.Column Worksheets("sheet2").Cells(r, c) = cl Next End Sub で良いはず。これをボタンのクリックイベントプロシジュアにすれば良い。 補足の件はなんか難しくしているように見える。 Selection.AreasにしなくてもSelectionで良いのでは。 E14以下にもって来たいなら、 #3を Sub test02() Dim cl As Range i = 14 For Each cl In Selection Worksheets("sheet2").Cells(i, "E") = cl i = i + 1 Next End Sub に改めればよい。

yanyanyanyan
質問者

お礼

回答ありがとうございます。 なるほど。。。っていうほどまだ精通してませんが じっくり読み砕いて理解していきたいと思います。 しかし色々なアプローチの仕方があるんですね。。。 スゴイの一言。

yanyanyanyan
質問者

補足

試してみましたー For Each ws In Worksheets If (ws.Name <> "データシート") And (ws.Name <> "整理後") And (ws.Name <> "リスト") Then For i = 8 To 26 Step 2 この部分書き足したいんですがどうすればいいんでしょう(泣) 自分で色々試したんですが全然駄目で泣きそうです。

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.4

Sub sample2() Dim r As Range Dim ws As Worksheet, i As Integer For Each ws In Worksheets If (ws.Name <> "データシート") Then i = 14 For Each r In Selection.Areas ws.Range("E" & i) = Worksheets("データシート").Range("D" & r.Row) i = i + 1 Next End If Next End Sub >'このiが駄目らしい For i=14 ~ For Each ~ Next Next にしないと、forループが閉じないからです。 前のままだと、ws.Range("E" & i) に同じ値が記入されるだけで意味のないループになっています。

yanyanyanyan
質問者

補足

ありがとうございます。 もうひとつだけ教えてください。 上記マクロを実行したところ For i = 14 To 32を満たすまで 同じものが何度もペーストされます。 で、「Selection.Areas.Count」回だけで 抜けたいのですが。。。。 図々しくてすみません

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

飛び飛びのセルをCopyできないようだから、 >別シートに貼り付ける どう貼りつけるのかハッキリしないが、列方向にでよければ Sub test01() Dim cl As Range i = 1 For Each cl In Selection Worksheets("sheet2").Cells(i, "A") = cl i = i + 1 Next End Sub では駄目ですか。

yanyanyanyan
質問者

補足

まずはありがとうございます。で、こんな感じにしたんですがコンパイルエラーが・・・ Dim r As Range Dim ws As Worksheet, i As Integer For Each ws In Worksheets If (ws.Name <> "データシート")Then For i = 14 To 32 Step 2 For Each r In Selection.Areas ws.Range("E" & i) = Worksheets("データシート").Range("D" & r.Row) Exit For Next i 'このiが駄目らしい End If Next ws End Sub Next で指定された変数の参照が不正です

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

Sub sample() Dim r As Range MsgBox "選択数は" & Selection.Areas.Count For Each r In Selection.Areas MsgBox r.Row Next End Sub for文の中で処理してください。 Shift で連続選択した場合は、「選択範囲の数」は1つとして処理されるので、「選択行」すべての値は取得できません。

全文を見る
すると、全ての回答が全文表示されます。
  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

ちょっと回りくどいですが、 ******************** Sub SENTAKUHANNI() Range("D1").Value = Selection.Address(0, 0) End Sub ******************** こういう感じで選択セルのデータをシートに転記し、 転記したデータをカンマでデータの「区切り位置」 で分割し、 出来たセルアドレスでループさせる、ではいかが?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCELマクロデータのある行より下の行削除の構文

    EXCELマクロ構文について教えてください。 データのある行のひとつ下の行全体選択し、 Ctrl+Shift+↓で下部行全て選択し、右クリックで削除する 操作をマクロにしたいのでですが、 マクロ記録では上の操作は Rows("189:189").Select Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlU  になります。 この 189 という数字は 下記の変数定義で「lastRow」として取得できるのですが Dim lastRow As Long lastRow = Sheets("2CVS関西").Cells(Rows.Count, 2).End(xlUp).Row + 1 189にlastRow に置き換える方法お教えください。

  • エクセルマクロで行き詰っています!!

    仕事でマクロを作成しているのですが、行き詰っています。 助けて下さい。 1行目には各項目があり、A行~F行まで、最終行は不定期 各行には個人情報があります。(1行目は項目欄) 2行目をコピーし3行目と4行目と5行目に行を挿入 3行目と4行目と5行目に2行目の情報を貼り付け 6行目をコピーし7行目と8行目と9行目に行を挿入 7行目と8行目と9行目に6行目の情報を貼り付け -繰り返し- 最終行をコピーし最終行の下3行目まで最終行の情報を貼り付け 要は2行目がAさんの情報だとすればAさんの情報とまったく同じものを3行目4行目5行目に挿入したいのです。 6行目がBさんの情報だとすればBさんの情報とまったく同じものをまた全部で4行作りたいのです。 30人のお客さん情報があれば2人のお客さん情報しかないときもあります。 最終行目が不定期なことと、空白じゃないセルまで繰り返すにすると最終行で永遠コピーされてしまうことが悩みです。 同じ結果であれば、方法が違ってもいいです。 マクロ初心者です。 私が作ったマクロは空白を挿入することしか出来ませんでした。 sub test2() range("a2:f2").select range(selection,range("a2:f2").end(xldown))).select dim colleft as long dim colright as long dim i as long application.screenupdating=false colleft=selection(1).colum colright=seletion(selection.count).column for i = selection(selection.count).row to selection(1).row+1 step -1 range(cells(i,colleft),cells(i,colright)).resize(4).insert(xlshiftdown) next i application.screenupdating=true end sub 上記が私が作れたマクロです。 作れたといってもいろんなサイトよりコピーして加工しただけなので、 不要なところも多々あるかと思います。 期限がせまっているので切羽詰っています。 誰か助けていただけませんか? よろしくお願いします。

  • エクセルのマクロ

    Sub test() x = Selection.Row y = Selection.Column z = Selection.Columns.count Range(Cells(x, y), Cells(x, y + z - 2)).Select Selection.ClearContents End Sub 上記マクロは、同一行の連続するセルを二つ以上選択状態にして実行すると、範囲内の最も右にあるセルの値のみが残って他のセルの値は全て消去されます。 上記マクロを、複数のセレクションに対して対応できるようにするには、どうすればいいでしょうか? 例えば、c1~f1、d3~h3、e10~g10を選択して実行すると、f1とh3とg10の値のみ残って他の値は消えるということです。

  • エクセルのマクロについてお願いいたします。

    エクセルのマクロについてお願いいたします。 E10~M10の500行全てのセルに数式が入っております。 そこでマクロにてコピーのボタンを設置しようと思ってます。 Range("E10:M10" & Range("M" & Rows.Count).End(xlUp).Row).Copy 画像のような数字の結果がある部分だけコピーをしたいです。 23行目からは数式が入ってますが結果は””空白になっております。 どうぞよろしくお願いいたします。

  • エクセルのマクロ セルの結合プロシージャを教えてください。

    マクロの記憶でのプロシージャを Rangeを変数型にしたいのです。 行も列も定めまずに、範囲はA1:BX45です。 Offsetを使うのか、もう何がなんだかわからないので 教えてください!! マクロの記憶でのプロシージャです。 ↓ Keyboard Shortcut: Ctrl+d ' End Sub Range("R26:T27").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge End Sub

  • excel: マクロ表記について

    マクロ表記について Range("E2").Select Selection.AutoFill Destination:=Range("E2:E2153"), Type:=xlFillDefault 上記はEXCELのマクロの式なのですが、この2153という数字が d = Range("A65536").End(xlUp).Rowのdという値と同じ場合、2153という数字をださないでdを使った表現ができますか。

  • エクセルマクロで長文です

    いつも皆様 度々教えて頂いて有り難うございます。 おかげさまで何とかいいところまで作成する事ができました。この場を借りて皆様に御礼申し上げます。  そこでしつもんなのですが、以下のマクロにおいて  (変数等の指定は省略します) columns("c:c").interior.colorindex = xlnone cnt = 3 temp = range("a6").value cells(cnt,3).resize(temp).interior.colorindex = 16 select case count1 case 1 cells(cnt,4).resize(temp).select selection.bordersaround linestyle:=xlcontinuous selection.bordersaround weight:=xlthin case 2 途中省略    case 4 (cells(cnt,4),sells(cnt,7)).resize(temp).select selection.bordersaround linestyle:=xlcontinuous selection.bordersaround weight:=xlthin とあるとします。  case4 の場合になぜか各セルの中にまで縦線の罫線が  入ってしまいます。 僕のイメージとしては範囲の大外のみの罫線と下線のみを 引きたいのですが、何処がまちがっているのでしょうか。 皆様お知恵をお貸し下さい。

  • Excelマクロ

    お世話になります。 Excelのマクロに関する質問です。 目的としては、D列に様々な文言が入っており、 D列に記入されている各文言の数をカウントしたいと思っています。 ただし、D列の各文言が複数あった場合でも、 A列が同じ値の場合は数に含めない、という条件があります。 ex)D列に「りんご」という文言が10個あります。   D列に「りんご」と記入されている行のA列は、 「赤」「青」の2パターンしかありません。 ⇒この場合、「2」とカウントしたいです。 現在、以下のマクロを考えています。 =========================================================== sub test() Dim i As Long, x As Long, cnt As Long, buf As Object '「i」「x」「cnt」を数値として定義。「buf」にD列の値を格納します。 x = 4 '4行目以降を対象としています。 Do While Cells(x, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 cnt = 0 '各行のD列に入っている値の数を数えるため、まずはカウントを0にします。 i = 4 '4行目以降を対象としています。 Set buf = Cells(x, 4) ' D列の値を変数「buf」に格納します。 Do While Cells(i, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 If Cells(i, 4).Value = buf And Cells(i, 1).Value <> Cells(x, 1).Value Then  ' D列の値が「buf」に格納した値と同じ、かつ、       ' A列の値が、bufに値を格納した時と異なる場合のみ対象 cnt = cnt + 1 '数を数える対象であれば、+1します。 End If i = i + 1 '次の行に移るために+1します。 Loop Cells(x, 5).Value = cnt ' E列にcntに格納された値を入力 x = x + 1 '次の行に移るために+1します。 Loop end sub ===================================================== 上記のマクロでは、E列にカウント後の数らしいものが入力されるのですが、 値が正しくないようです。 お力添えをいただけますでしょうか。 よろしくお願いいたします。

  • エクセルのマクロ

    縦方向に連続したセルを選択状態にした時に、選択セルを基点として右横方向に連続してデータが入力されているセルを罫線で囲う、という処理をマクロで実行したいのですが。 例えば、以下の図で黒丸がデータ入力セルであるとすると、C1~C4を選択状態にして実行すると、C1~D1とC2~F2とC4が罫線で囲われます。  AB CD EFG 1○●●●○○○ 2●●●●●●○ 3○○○○○○○ 4●●●○○○○ 以下のマクロを実行すると、上図の3行目と4行目のところがかなり余計に罫線が引かれてしまいます。どう修正すればいいでしょうか? Sub test1()  yc = Selection.Rows.count  aa = ActiveCell.Address  For y = 0 To yc - 1  ActiveCell.Offset(y, 0).Select  Range(ActiveCell, ActiveCell.End _       (xlToRight)).Select        With Selection.Borders(xlEdgeLeft)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeTop)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeBottom)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeRight)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    Range(aa).Select   Next y End Sub

  • エクセルのマクロ 最終行取得後の作業

    エクセルのマクロで(エクセル2010を使用) Range("A1:A900").Select Range("A" & Rows.Count).End(xlUp).Select i = Selection.Row 上記の900がセルの最終行で最終行数を取得し、iを利用して  Range("A1:A & i ").Select といった感じで使用したいのですが記述がわかりません。 申し訳ございませんが()内の書き方を教えてください。

専門家に質問してみよう