エクセルVBAのコーディング

このQ&Aのポイント
  • エクセルVBAを使用して複数のシートから特定のセルをコピーして別のシートに貼り付ける方法について教えてください。
  • 現在、エクセルのVBAコードを作成していますが、Sheet4のセルA16のデータをSheet1のU63にコピーする方法がわかりません。どのようにコードを書けばいいですか?
  • エクセルVBAで特定のシートから特定のセルをコピーして別のシートに貼り付ける方法について教えてください。
回答を見る
  • ベストアンサー

エクセルVBAのコーディング

現在、次のようなことがやりたくてエクセルのコードを作ってみました。 ・データが書かれたエクセルの複数のsheetの特定のセルをコピーして、sheet1にコピーペーストしていきたい。 そこでこのようなコードを書いてみました。 Private Sub Worksheet_Activate() Sheet4.Select Range("A16").Copy Sheet1.Select Range("U63").Select Sheet1.Paste End Sub とりあえずSheet4のセルA16のデータをSheet1のU63にコピーペーストするようにしてみたのですが、うまくいきません。 この場合のコードの書き方をご教授いただけないでしょうか? どうぞ、よろしくお願い致します。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

どうしてわざわざWorksheet_Activateを使っているのかご相談で何も説明が無いので、その点の良しあしはタッチしない事にします。 マクロが単純に起動できていない可能性もありますが、(Activateがいいのか他の方法が良いのかは今回のご質問とは本質的に無関係なので)使い勝手で判断してください。 とはいえ、ご質問のマクロの間違いは、worksheet_Activateを使った事に間接的な原因があります。それを使いたいなら、他のシート(今回はシート4)のセルを触る場合には(あなたが書いたマクロのように)「シートを開いてセルを触る」では正しく動作しません。下記のように必ず漏れなく「シート.セル」のように書かないとダメです。 訂正版: private sub worksheet_Activate()  worksheets("Sheet4").range("A16").copy destination:=worksheets("Sheet1").range("U63") end sub 一旦別のシートを開いてから、改めてマクロを埋めたシートを開きなおして起動させる。

alpha_diy
質問者

お礼

回答いただきありがとうございます。助かります。 Private Sub Worksheet_Activate() Worksheets("Sheet4").Range("A16").Copy Destination:=Worksheets("Sheet1").Range("U63") End Sub このようにコードしてみて、デバッグでステップインさせたところこのようなエラーが出てきました。 ”実行時エラー '9': インデックスが有効範囲にありません。 ” このようなエラーが出てきて、動作が止まってしまうのですが、解決方法など教えていただけませんでしょうか?

その他の回答 (4)

noname#172491
noname#172491
回答No.5

他の方もご指摘されていますが、シート名が誤っている可能性が高いと思います。 「sheet4」という名前のシートを指定してるけど、そんなんないよ!てなエラーメッセージですね。 もしかして、マクロをくんでいるエクセルファイルと、処理したいシートのあるファイルが違うなんてことはないですよね?

alpha_diy
質問者

お礼

回答頂きありがとうございます。 >もしかして、マクロをくんでいるエクセルファイルと、 >処理したいシートのあるファイルが違うなんてことはないですよね? これに関しては、ファイルは同一のものです。 Sheet1,Sheet4にはそれぞれ名前はつけていますが、そのままSheet1,Sheet4を使用することはできませんでしょうか?

alpha_diy
質問者

補足

回答頂きありがとうございます。 >Destination:=Worksheets("Sheet1") >とかのところを、worksheets("正しいシート名")の >ように記入します。 >正しいシート名とは、エクセル画面で見たときに >画面の下のシート名タブのところに書いてある名前の事です。 エラーの原因がこの問題だったことに今気づきました。 大変申し訳ありません。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

>このようなエラーが出てきて、動作が止まってしまうのですが、解決方法など教えていただけませんでしょうか? ご自分のブックのシート名も把握していないのですか? Worksheets("Sheet4") とか Destination:=Worksheets("Sheet1") とかのところを、worksheets("正しいシート名")のように記入します。 正しいシート名とは、エクセル画面で見たときに画面の下のシート名タブのところに書いてある名前の事です。 それとも元のマクロでも気にはなっていましたが、オブジェクト名でマクロを書く癖が付いているので理解できなかったのでしょうか。 それならそれでも出来ますので、適切に応用してください。

alpha_diy
質問者

お礼

回答頂きありがとうございます。 >Destination:=Worksheets("Sheet1") >とかのところを、worksheets("正しいシート名")の >ように記入します。 >正しいシート名とは、エクセル画面で見たときに >画面の下のシート名タブのところに書いてある名前の事です。 エラーの原因がこの問題だったことに今気づきました。 大変申し訳ありません。

noname#172491
noname#172491
回答No.3

あまり詳しくないですが、これでできると思います。 '(1)シート4にあるA16のセルをコピー Sheets("Sheet4").Range("A16").Copy '(2)シート1にあるU63のセルを選択 Sheets("Sheet1").Range("U63").Select '(3)選択したセルにペースト ActiveSheet.Paste (2)と(3)を一緒にしたいと思い、 Sheets("Sheet1").Range("U63").Pasteとしたいと思い試しましたが、これはエラーになってしまいました。 知識が少ないため、その理由は分かりません・・・。

alpha_diy
質問者

お礼

回答いただきありがとうございます。 教えていただいたコードでやってみたのですが、 ”実行時エラー '9': インデックスが有効範囲にありません。 ” このようなエラーが出てきて、動作が止まってしまうのですが、解決方法など教えていただけませんでしょうか? エクセル2007を使用しています。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> コピーペーストするようにしてみたのですが、うまくいきません。 「どの行で」「どのようなエラーが出て」うまくいきません。を書いてください。 > Sheet4.Select Worksheets("Sheet4").Select か。 「マクロの記録」を実行して、なさりたいことをすれば冗長ですが自動生成してくれます。

alpha_diy
質問者

お礼

回答いただきありがとうございます。 マクロの記録というのは便利そうですね。

関連するQ&A

  • エクセルVBAでコピーすると行の高さが低くなる

    いつもお世話になってます。 エクセル2003のVBAで、セルの範囲を指定してコピーすると行の高さが低くなってしまいます。その他の書式は、変化せずうまくコピーできています。以下がプログラムです。 Sub copy_hyou() Worksheets("sheet1").Activate Range("A1:K24").Copy 'セルA1からK24をコピーします。 Range("A25").Select 'A25からペイストします。 ActiveSheet.Paste End Sub どう直せば、行の高さもコピーできるでしょうか? お休み中すみませんがよろしくお願いいたします。

  • VBAについて教えて下さい

    作業内容 (1) 「 初期入力 ! B列 」 ダブルクリック VBAProject ⇒ 「 初期入力 ! 」 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Cells.Count > 1 Then Exit Sub If Target.Column <> 2 Then Exit Sub ドロップダウン代わりに「Data ! 」を表示 Sheets("Data").Activate End Sub (2) 値をダブルクリックして、「初期入力」に戻る。 VBAProject ⇒ 「 Data ! 」 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Range("FC63364").Activate Sheets("初期入力").Activate ’選択した値を「初期入力!」シートに戻す ActiveCell.Value = Target.Value End Sub ここまでが現在の作業です。 現在の工程内に下記を増やしたいのですが、エラーが出て増やせません。教えて頂けませんか> (3) 「Data ! FB63375,FG63375,FI63375」 を 「拾い出し ! K4」 にコピー&ペーストしたいです。 「Data ! FB63375」⇒「拾い出し ! K4」へ 「Data ! FG63375」⇒「拾い出し ! L4」へ 「Data ! FI63375」⇒「拾い出し ! M4」へ Range("FB63375,FG63375,FI63375").Select Range("FI63375").Activate Selection.Copy Sheets("拾い出し").Select Range("K4").Select ActiveSheet.Paste Sheets("Data").Select End Sub *次回「Data!FB63375,FG63375,FI63375」をコピーすると、前回コピーされた下の行「拾い出し ! K5」にコピーするようにしたいです。 (4) Data!FC63367:FI63374」を「拾い出し!O4」にコピー&ペーストしたいです。 Range("FC63367:FI63374").Select Selection.Copy Sheets("拾い出し").Select Range("O4").Select ActiveSheet.Paste Sheets("Data").Select End Sub *次回「Data!FC63367:FI63374」をコピーすると前回コピーされた下の行「拾い出し!O11」にコピー&ペーストしたいです。 お分かりになられる方おられましたら、教えて頂けませんか? 宜しくお願いします。

  • Excel Selectは使わない? VBA

    おはようございます。 ExcelのVBAを独学しております。 いまさらな質問だとは思いますが、 そこで、色々調べていたところ 「Select」はあまり使うな! ということが良く出てきました。 selectを使わず、上手くシート移動などができるのでしょうか? 私が組んでいるものは、色んなシートを切り替えなければならなく、 毎回Selectしています。 Activateを使ったこともありますが、 エラーが多発し、良く分からなかったためSelectを使用しています。 出来れば、シートをアクティブにすることなく 操作ができれば良いのですが・・・ 例)「データ」「コピー」のシートがあります。 「データ」シートのAからD列を「コピー」シートにコピー しようとするものです。 WorkSheets(データ).select Range("A1").select Range("A:D").select selection.copy Worksheets("コピー").select Range("A1").select ActiveSheet.Paste どうしてもSelectを多様してしまいます。 ●Selectを使わないデータの入力方法 ●Selectを使わず、シートをアクティブにしなくても良い参照方法 ●どうしてもSelectを使わないといけない場面 ●Selectを使うのを回避するためには・・・ などなど、ご存知でしたら回答お願い致します。

  • エクセルのVBAの変更点がわからないので教えてください

    下のようなプロシージャをエクセルに組み込んでいますが、次のようなことができるように変更したいので教えてください。 なお、プロシージャは正常に作動しています。 Private Sub Worksheet_Activate() With Sheets("シート名") .AutoFilterMode = False .Range("A1:d1").AutoFilter .Range("A1:d1").AutoFilter field:=1, Criteria1:="<>" .Range(.Range("d1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") .AutoFilterMode = False .Range("A1:d1").AutoFilter End With End Sub 修正してできるようにしたいこと 1、with sheets("シート名")のシート名にシートがアクティブになったとき、そのシート名が自動で入るようにしたい。 ※シートの数は6シーとあります。 2、セルd1のデータからその行のデータ全体がコピーされるので、必要なセルのデータのみがコピーできるようにしたい。

  • VBAでの結合セルのコピー&ペースト

    こんにちは。 EXCELのVBAでマクロを作成しています。 セルの値のコピー&ペーストを行おうとしているのですが、結合されているセルのペーストのときに、「同じ結合セルが必要です」とエラーになってしまいます。 例えば、A1とA2が結合されたセル+A3をコピー Worksheets(x).Activate Range("A1:A3").Selection Range("A1:A3").Copy 別のシートで、B1とB2が結合されたセル+B3にペースト Worksheets(y).Activate Range("B1:B3").Paste セルの結合を解除すればうまくいきます・・・ セルを結合したままペーストしたいのですが、どうやら間違っているようです(ノ_・。) どなたか教えてください。 よろしくお願いします。

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • エクセルVBAで再質問です。

    QNo4011183で質問したもので、また質問です。 前回の回答で、以下のような良回答をいただきました。 A1セルで名前を選択して、その名前と同じ定義済みの別シートの範囲 を、違うシートにコピーする、というものです。 使っているうちに気づいたのですが、コードを書いてあるシート のどこを入力しても反応(メッセージがでます)してしまいます。 これは、回答者様からのコードを自分の設定に合わせて変更した ものですが、このように使っています。この場合、「入力」シート のG10セルのリスト(入力規則)で選択されたものに反応してくれ たらいいのですが、他のどのセルでも反応し、“変更しました。” と書いてあるメッセージが出ます。これをなんとかできないでし ょうか?度々すみませんが宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Sheets("組版").Select ActiveSheet.Range("A13:V21").Clear Sheets("入力").Select If Target.Address = "$G$10" Then Sheets("登録").Range(Target.Value).Copy Sheets("組版").Range("A13").PasteSpecial Paste:=xlAll Application.CutCopyMode = False End If MsgBox "変更しました。" End Sub

  • エクセル2007マクロ シート間のセルコピー

    [Sheet1]にあるデータを[Sheet2]にコピーするマクロボタンを[Sheet2]に作りたいのですが、マクロがよく分からないので、「マクロの記録」で作成してみました。 Sub siken() ' ' siken Macro ' ' Sheets("Sheet1").Select Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B3").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B6:D6").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B6").Select ActiveSheet.Paste End Sub (実際はもっと多くのセルをコピーします) マクロを実行すると、ちゃんとコピーできるのですが、セルをコピーする都度[Sheet1]と[Sheet2]が交互に表示されます。 コピー元の[Sheet1]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • Excel2003のVBAで教えてください

    以下のようなコードのプログラムを書いています。 使用しているシートは、"data"と"入力"という2つのシートです。 "入力"シート上で入力したデータを"data"シート上に追加していく予定です。 しかし、どうしても、"入力"シート上にペーストされてしまい"data"シート上にペーストすることができません。 Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues が問題だとおもうのですが、これを Range("data!A" & z + 1).PasteSpecial Paste:=xlPasteValues と変更すると、実行時エラー1004になってしまいます。 アドバイスお願いします Private Sub CommandButton1_Click() Dim n As Integer Dim z As Long n = WorksheetFunction.CountA(Range("b9:b23")) Range("b51:f" & 51 + n - 1).Copy Set data = Worksheets("data").Range("A1") z = data.Rows.Count Sheets("data").Select Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues MsgBox "登録しました" End Sub