• 締切済み

VBA ボタンに登録するセルの参照の仕方。

参照するセルを指定する方法を教えていただきたいです。 現在の私の知識ですとボタン一つずつに参照セルを一つずつ手打ちするしかなくて。想定としては2000行に2000個ぐらいを想定しております。 フォームコントロールのボタンにマクロを登録して添付画像のように各行に一つづつ配置したいと考えております。 ボタンに登録するマクロは以下のようなもので、ボタンを配置した行と同じ列の特定セルを画像左側のカレンダーにペーストするといったものです。 Sub ボタン_Click() ' セルを選択してコピー Range("AE2").Copy ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False 'コピー状態が残るのでキャンセル End Sub 皆様のお力を貸していただけると幸いです。 よろしくお願いします。 ※エクセルのバージョンはHome and Business 2019 です。

みんなの回答

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.15

No.3のコードにカレンダー範囲外への代入を除外するのを追加したら Sub ボタン1_Click() If ActiveCell.Row < 2 Or ActiveCell.Column < Columns("D").Column Or ActiveCell.Column > Columns("J").Column Then MsgBox "選択セルがカレンダー範囲外です", vbCritical Exit Sub End If ActiveCell.Value = Cells(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row, "AE").Value End Sub

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.14

回答No.13 は 回答No.3 と同じ事を回答してますが…見逃しかなぁ。

  • SI299792
  • ベストアンサー率48% (714/1472)
回答No.13

要するに、 2行目のボタンを押す:AE2 →アクティブセルへコピペ。 3行目のボタンを押す:AE3 →アクティブセルへコピペ。 ですか。 画面にAE列はありませんが、そこにデータが入っている想定です。 Option Explicit ' Sub Macro1()   Dim RowP As Long '   RowP = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row   ActiveCell = Cells(RowP, "AE") End Sub

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.12

No.11の補足です If Target.Column >= Columns("D").Column And Target.Column <= Columns("J").Column Then Cancel = True If MsgBox("カレンダーを更新しますか?", vbYesNo + vbQuestion) = vbYes Then Target.Value = Cells(Range("X1").Value, "AE").Value End If End If のところは念のために以下のようにしておいた方がいいかもしれません。 If Target.Column >= Columns("D").Column And Target.Column <= Columns("J").Column And Range("X1").Value <> "" And IsNumeric(Range("X1").Value) Then Cancel = True If MsgBox("カレンダーを更新しますか?", vbYesNo + vbQuestion) = vbYes Then Target.Value = Cells(Range("X1").Value, "AE").Value End If End If

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.11

No.3,No.4,No.5の追加です。 ボタンで操作が操作する人にとって感覚的に一番だと思いますが ダブルクリックもありかもしれません。 X列でダブルクリックしてカレンダーでダブルクリックすると、AE列のデータが代入されるというものです。 たとえばX2をダブルクリックしてカレンダーの任意のセルをダブルクリックするとAE2のデータが代入される。 X1に行番号を入れますのでX1を開けておいてください。 (X1を見るとダブルクリックで該当行番号がセットされた事がわかります) 一度X列をダブルクリックするとカレンダーで何度でも同じAE列のデータを代入できます。 該当のシートモジュールに Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Row < 2 Then Exit Sub End If If (Target.Column < Columns("D").Column Or Target.Column > Columns("J").Column) And Target.Column <> Columns("X").Column Then Exit Sub End If If Target.Column = Columns("X").Column Then Cancel = True Range("X1").Value = Target.Row Exit Sub End If If Target.Column >= Columns("D").Column And Target.Column <= Columns("J").Column Then Cancel = True If MsgBox("カレンダーを更新しますか?", vbYesNo + vbQuestion) = vbYes Then Target.Value = Cells(Range("X1").Value, "AE").Value End If End If End Sub

  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.10

訂正。 If Rw >2 And Rw < 2001 Then は If Rw >1 And Rw < 2001 Then の誤りでした。

  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.9

ボタン1つで複数の行を処理する場合の例 Sub ボタン1_Click() Dim Rg As Range Dim Tg As Range Dim Rw As Integer Rw = 0 For Each Rg In Selection If Rw <> Rg.Row Then Rw = Rg.Row Cells(Rw, 1).Interior.ColorIndex = 3 End If Next End Sub このマクロは、選択している範囲の「A列」のセルの背景色を赤くします。 C5~M11を選択している状態でボタンを押すと、A5~A11のセルの背景が赤くなります。 RwにTg.Rowを代入した後に「Rwが2~2000の範囲にある時だけ実行する」というif文を加えれば「表の外を選択している場合は無視する」ようになります。 Sub ボタン1_Click() Dim Rg As Range Dim Tg As Range Dim Rw As Integer Rw = 0 For Each Rg In Selection If Rw <> Rg.Row Then Rw = Rg.Row If Rw >2 And Rw < 2001 Then Cells(Rw, 1).Interior.ColorIndex = 3 End If End If Next End Sub このようにすれば「ボタン1つ」で「選択している範囲の複数の行」について処理できます。 2~2000行を選択してボタンを押せば、2~2000行の全部を予定作成出来ますし、転記も出来ます。2~2000行の全部に2000個のボタンを置く必要はありません。

  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.8

ボタンは1個だけにして、ボタンは「スクロールしないように設定した見出し行」や「別シートのスクロールしない表」や「表と連動してスクロールしないユーザーフォーム」に置きます。 ボタンを押した時は「対象シートの、選択された行」に対して処理を行います。 3行目を処理させたい時は、A3やB3やC3などのセルを選択した状態で、ボタンを押します。 5~1203行をまとめて処理させたい場合は、A5~A1203のセルを選択した状態で、ボタンを押します。 こうする事で「1個のボタン」で「今、選んでいる行を自由に処理」できます。 画像の表にボタンを作るなら、 ・A~K列の「左の表」は「2行目」から作成する ・L~V列の「右の表」は「1行目」から作成し、1行目を「見出し行」に設定してスクロールしないようにする ・ボタンを「X1セル」に置いて、スクロールしないようにする という作り方をして、ボタンは「現在の選択範囲(但し、表の外側を選択範囲に含んでいる場合は無視する)ついて処理する」ようにマクロを作ります。 そうすると「1つのボタンで、自由に選んだ位置(行)について処理が可能」になります。 行ごとにボタンを量産する必要はありません。 それに、1つのブックにボタンを2000個も作ったら、マクロが巨大になり、ブックが開けなくなったり、ブックを開くのに時間が掛かったりして、実用にならないブックが出来上がります。 もし「ボタンを増やした直後に保存したら、ボタンが多過ぎるのが原因のラーで開き直す事が出来なくなった」としたら、2度とそのブックを開けなくなり、それまでの苦労が全て失われます。 ボタン以外のオブジェクトの乱造でも同様ですので注意して下さい。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.7

#6に追記します。 私の示したコードは、 複写元の行を特定し、複写先セルを選択する順番です。 もし、 複写先セルを選択し、その後、複写元の行を特定する順番を期待するのであれば 提示したコードを変更することで対応できます。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.6

>2000行に2000個ぐらい これだけのボタンとコードを配置するのは面倒ですし 常識的には現実的じゃないだろうと思います。 私だったら、 コンテキストメニュー(右クリックして表示するメニュー)を使います。 後記コードが、 ・コンテキストメニューを表示するコード ・コンテキストメニューを非表示するコード ・対象の行番号を取得するコード ・取得した行番号のAE列の値を   選択したセルに貼り付けるコードです。 Option Explicit Dim TargetRow As Long 'コンテキストメニューを追加 Sub AddMenu()  Dim Newb As CommandBarControl  Set Newb = CommandBars("Cell").Controls.Add()  With Newb   .Caption = "複写元データ取得"   .OnAction = "DataGet"  End With  Set Newb = CommandBars("Cell").Controls.Add()  With Newb   .Caption = "複写元データ貼付"   .OnAction = "DataPut"  End With End Sub 'コンテキストメニューを削除 Sub DeleteMenu()  On Error Resume Next  CommandBars("Cell").Controls("複写元データ取得").Delete  CommandBars("Cell").Controls("複写元データ貼付").Delete  On Error GoTo 0 End Sub '対象の行番号を取得 Sub DataGet()  If ActiveCell.Column < 11 Then   MsgBox "K列以降のセルを右クリックしてください"   TargetRow = 0   Exit Sub  End If    TargetRow = ActiveCell.Column End Sub '選択した行番号のAE列(31列目)の値を選択したセルに複写 Sub DataPut()  Dim rc As VbMsgBoxResult    If TargetRow = 0 Then   MsgBox "複写元が未選択"   Exit Sub  End If  If ActiveCell.Column > 10 Then   MsgBox "カレンダーのセルをを右クリックしてください"   Exit Sub  End If    rc = MsgBox(Cells(TargetRow, 31).Value & "を貼り付けます", vbYesNo + vbQuestion)  If rc = vbNo Then Exit Sub  'ActiveCell.Value = Cells(TargetRow, 31).Value  'または  'Cells(TargetRow, 31).Copy ActiveCell  'または  'Cells(TargetRow, 31).Copy  'ActiveCell.PasteSpecial Paste:=xlPasteValues  'Application.CutCopyMode = False End Sub

関連するQ&A

  • ボタン登録コピーペーストの記述の仕方

    質問があります。 ボタンにマクロを登録して、押下するとシート3から特定の列4行のみ全てコピーして(100~500件で変動)、シート1の固定された開始地点からペーストするマクロを作成しました 以下のソースは文章で表現した通りのものとなっていますでしょうか? ---------------------------------------------------------------------------------- Sub ボタン登録コピーペースト () MsgBox "マクロを実行しました" Sheets(3).Select‘コピー元データ(シート3) Range("C:C,M:M,AE:AE,AF:AF").Select ‘4列の変動するデータすべて100~500件 ‘選択します Selection.Copy Sheets(1).Select‘コピー先データ Range("C70").Activate‘まず固定開始位置C70を選択する Selection.PasteSpecial Paste:=xlPasteValuesApplication.CutCopyMode = False ‘4列のデータ数百件すべてコピーする End Sub --------------------------------------------------------------------------------

  • セルの選択

    よろしくお願いします。 AE1:AI15の中のあるセル(6桁の値が入っています)を選択している状態から始まりまり、セルAA3に貼り付け、別のマクロ(検索)を実行後、また元のセルにマクロで戻りたいのですが、 どなたか詳しい方教えて下さい、よろしくお願いします。 Private Sub CommandButton2_Click() '検索ボタン Application.ScreenUpdating = False Selection.Copy Range("AA3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False 検索 End Sub

  • エクセルVBAで空白セルを削除する方法

    みなさん教えてください。 今エクセルVBAで、下記のようにのA列に空白セルがある場合にそのセルを削除し、 空白セルが無い場合何もしないと言うマクロを作っています(下記のように自動記録し ました)。 しかし、作成したマクロは、下記のようにA列に空白セルがない場合はエラーが出てし まいます。 空白セルが無い場合エラーが出ない方法を教えて頂けないでしょうか。 よろしくお願いします。 <マクロ> Sub Macro1() Columns("A:A").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.SpecialCells(xlCellTypeBlanks).Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp End Sub <データ> A --------- 1 2 1 1 1 3 4 ・ ・ ・ (以降約300行続きます)

  • セルをコピーしてシート名を取得 【VBA】

    こんばんわ。 エクセルのVBAについて、どうしてもわからなくなったので質問させて下さい。 マクロの内容は 1.一番前のシート(名前はSheet1ではありません。)のボタン35をクリック 2.シートをコピーして3番目に置く。 3.値にする。 4.シート名をセルの"DE16"に入っている値にする。 5.ボタンを消す。 以下の内容になりましたが、名前のところでデバックがおこります。 Sub ボタン35_Click() Worksheets(1).Select Worksheets(1).Copy After:=Sheets(3) Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Worksheets(3).Select Worksheets(3).Name = Range("DE16").Value ActiveSheet.Shapes("Button 11").Select Selection.Delete Application.CutCopyMode = False End Sub どなたかお知恵を貸して下さい。

  • VBA セルの値を別セルにコピーするには

    VBAでPastespecialでセルの値を別セルにコピーするマクロを組みたいです。 以下は参考にしたソースコードです。 Worksheets("Sheet1").Range("A1:B10").Copy Worksheets("Sheet2").Range("A1").PasteSpecial _                  Paste:=xlPasteValues, _                  Operation:=xlNone, _                  SkipBlanks:=False, _                  Transpose:=False あるExcelマクロの入力フォームSheetに、製品リストと使用している場所のマスタデータをクエリで読み込んで、製品IDと場所のコードを入力したらINDEX関数で抽出し、マクロ実行ボタンを押すと抽出結果を入力フォームの入力欄に貼り付けします。 上記のマクロだと貼り付けする元セルを移動させたら内容がずれた値がそのまま貼り付けされてしまうと思われますが、地道にコードのコピー元のセルを書き直さないといけないのでしょうか。 Excelの関数だと参照範囲を固定したら掴んで移動させてもセル番地が連動して移動してくれますが、マクロの場合どのようにすれば良いでしょうか。 また、複数個所のセルをコピーするので Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False をコピーするセルの箇所に毎回入れていますが、コピー元のセル・コピー先のセル番地を一括して実行する方法はありますでしょうか。 VBAはソースコードを参考に当てはめているだけで、自力でコードを書くスキルは皆無です。 Excelは2016です。 詳しい方いましたらご教授ください。よろしくお願い致します。

  • VBAでコマンドボタン操作で他のシートにコピーする方法を教えてください。

    エクセルのVBAでコマンドボタン操作でセルの値を他のシートのセルへコピーしたいのですが、やり方がわかりません。 自分なりに作ってみたのですが何が悪いのか教えてください。 Private Sub CommandButton1_Click() ' Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Private Sub が怪しいのですが対処もわかりません。 ちなみにsheets2のA1には値がはいっています。 よろしくおねがいします。

  • エクセル2000VBA コマンドボタンがうまく動きません

    こんにちは、VBA初心者です。 2枚のシートがあり、「入力」というシートの任意のセルを、「出力」という別シートにコピーするという作業をコマンドボタンによって行いたいと思っています。 自分で作ってみたものは、このようになります。 Private Sub 任意の行のコピー・印刷_Click() Application.ScreenUpdating = False 'セル内容コピー Selection.Copy Sheets("出力").Select Range("A9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("入力").Select ActiveCell.Offset(0, 1).Select Application.CutCopyMode = False Selection.Copy Sheets("出力").Select Range("C9").Select (以下略) ところが、これだと 「実行時エラー1004 RangeクラスのSelectメソッドが失敗しました」と表示され、デバッグをかけると6行目のRange("A9").Selectが黄色く反転した状態になります。 どうしてでしょうか。 同じ内容のものをマクロで登録し、実行すると、何の問題もなく動くのですが… ほとほと困っております。 どうかよろしくお願いします。

  • エクセルVBAのテキスト保存の仕方

    次のようなマクロがあり、最後の行でできあがった表をクリップしています。 現在そのクリップボードの表をテキストに手動で貼り付けてその都度保存しているのですが これを自動的にテキスト保存できればと思っています。 更にファイル名は左上1セルめ(この場合多分A1000のセル)にある文字列の最初から10文字をファイル名にしたいです。 マクロはよく知らないので記述の仕方を教えてください。 ※このマクロはマクロの記録により自動作成したものです。 よろしくお願いします。 (office2013/Windows7) Sub rep1000行削除集約() Dim i As Long Range("AC1.AI650").Copy Range("A1000").PasteSpecial Paste:=xlPasteValues Range("A1000:A2000").Value = Range("A1000:A2000").Value Range("A1000:A2000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete Application.Goto Reference:="R1000C1" Range("A1000:G1000").Select Range(Selection, Selection.End(xlDown)).Select Application.CutCopyMode = False Selection.Copy End Sub

  • セルにデータ有無でマクロ自動に起動する方法

    エクセル セル A1 に品目コードを貼付けた瞬間に特定のマクロが起動する方法を教えてください。 セルA1 に C-GS5U0001 を貼付 セルB1 に A1を参照するVlookupがある。 せるC1 に B1をテキスト文字に変換する。 C1用のマクロは Range("B1").Select Selection.Copy Range("C1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub セルA1にデータをいれたらC1に関数引当て無しのテキストにしたいのです。

  • エクセルでセルの値を参照してコピー

    エクセルで一枚の表があり、 各行の先頭列はユニークなIDが入力してあります。 例; 100 ◆ ▲ ● : 123 ■ ▽ ◎ : 200 ◇ ▲ ○ というIDがある表が、 A3からD102まであるとします。 A1セルに 123という数値を入力して、 マクロを登録したボタンを押すと、 123が先頭列のデータをコピー (この場合はA25~D25ですね) して、 A2セルに貼り付けるためには、 どのようなマクロを書けばよろしいでしょうか? 説明が足りなければ補足させていただきますので、 どなたかご教示いただければ幸甚です。 よろしくお願いします。

専門家に質問してみよう