• 締切済み

エクセルVBAで別シートにコピー貼り付け

VBA初心者です。下記のようにプログラムしましたがうまくいかなくて困ってます。どなたかお力をお貸しください。内容としましては輸入Partsのシートからコピーして商品内容確認のシートのセルB17に貼り付けたいです。輸入Partsシートで3列目の空白を探し同じ行の1列目をコピーします。商品内容確認のシートのセルB17にはカーソルは動いているようですが貼りつきません。 Private Sub 商品内容確認2_Click() If MsgBox("商品内容確認へ移動しますか?", 33, "移動の確認") = 2 Then MsgBox "処理を中止します。" Range("A2").Select Exit Sub End If Dim Line As String Dim Maxrow As String Worksheets("輸入Parts").Select Line = 2 Do Until Cells(Line, 1).Value = "" On Error Resume Next If Cells(Line, 3).Value = "" Then Cells(Line, 1).Copy 'コピーする Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 Worksheets("商品内容確認").Range("B" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop Worksheets("商品内容確認").Visible = True Worksheets("商品内容確認").Select Worksheets("商品内容確認").Range("B6").Select Worksheets("商品内容確認").輸入Partsシート2.Visible = True Worksheets("商品内容確認").輸出Partsシート2.Visible = False Worksheets("輸入Parts").Visible = False End Sub

みんなの回答

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

>輸入Partsのシートからコピーして商品内容確認のシートのセルB17に貼り付けたいです。 ふむふむ。 >Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 >Worksheets("商品内容確認").Range("B" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け 何これ。B17に貼り付く訳ないじゃん。 「B列の一番最後を探して、一番最後の行の次の行」に貼り付けようとしてるじゃん。 どっかのマクロを参考にしたんだろうけど、何やってるかも判らずに使ったら、思い通りに動く訳ないじゃんか。 あと、ペーストする時は、ペースト先のワークシートを選択してからペーストしないとエラーになるので、ペーストされずにエラーになって、そのエラーも On Error Resume Next で「エラー無視して次に進め」ってやってるから、結果的に「何も貼り付かない」よ。 On Error Resume Next ってのは「完成してちゃんと動作するまで、決して使ってはならない」のよ。 未完成なのにこんなの入れたら「エラーが出てもエラー表示しない」から「何かエラーが起きても、無かったことになる」ので、自分のプログラムミスに気付けないし、動作しない原因も判らなくなる。 とにかく「初心者はOn Errorは絶対に使うな」って事。使っても良いのは「完成した後」だけ。 とりあえずOn Error Resume Nextをコメントにして(頭に ' (Shift+7)を付ける)実行してみな。何で動かないかが一発で判るから。

回答No.1

途中途中の Cells(Line, 3).Value = ""など、 結局どこを表示しているのか分からない状態が多いので With Worksheets("輸入Parts")   .select If .Cells(Line, 3).Value = "" Then Cells(Line, 1).Copy 'コピーする End with そして、そもそも値を貼り付けるだけなのなら =で繋いでしまうほうが簡単だと思います。 If .Cells(Line, 3).Value = "" Then Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 Worksheets("商品内容確認").Range("B" & Maxrow).value=Cells(Line, 1).value End If とかでしょうか? 試していないため、合っているかどうかは分かりませんが…

関連するQ&A

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセル VBA 各シートに貼り付け

    いつも皆様には大変お世話になっております。 表題に書いたようにコピーしたものを貼り付けしたいのですがうまく動きません。 Sheets("A").Select Range("B8:B38").Select Selection.Copy For Each sh In Worksheets If sh.Name <> "A" Then Range("B12:B42").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Range("F38").Select ActiveWindow.SmallScroll Down:=-12 End If Next と言った様な構文を書いているのですが Aのファイル内のみでコピーして貼り付けをやってしまいます。 ちなみにシートはB,C,Dなど各種あります。 よろしくお願いいたします。

  • エクセル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で行のコピー貼り付けについて

    初心者、勉強中でエクセル2007です。 A1行からK40行までの表があります。 これを下にコピーをしながら増やしていってるのですが、マクロでしようと思い下記のとおり 考えました。 selecion.row.Offset(39, -1).Select ここでオブジェクトが必要ですと出ます。 それからその下の?とを色々ぐぐってみますがどうしてもわかりません。 それと2007ですので65536行ではないのですが、MaxRow = Cells(Rows.Count, 1).End(xlUp).Row だと動かないみたいですので下記としています。 よろしくご教授お願いします。 Sub Gcopy() MaxRow = Range("B65536").End(xlUp).Offset(-39, -1).Select データの入ってる最終行を取得 Selecion.row.Offset(39, -1).Select 選択された行から上に39行移動し選択 ?                    下へ39行まで選択   MaxRow = Range("B65536").End(xlUp).Offset(1, -1) 最終行を取得 ActiveSheet.Paste 貼り付け End Sub

  • マクロ EXCELの範囲をコピーして貼付け

    『End(xlDown).Row』で取得した値を使ってセルの範囲指定&コピーを行い、 新しく追加したシートに貼り付けたいのですがうまくいきません。 Sub attendanceJoin() Dim MaxRow As Integer 'シートの最終行の値 Workbooks("test.xls").Activate Dim NewWorkSheet As Worksheet Set NewWorkSheet = Worksheets.Add() '新しいシートを追加する MaxRow = Worksheets(2).Range("M1").End(xlDown).Row  'A列の最終行を取得 NewWorkSheet.Name = "統合"  '新しく追加したシートの名前を変更 With Workbooks("test.xls") .Worksheets(2).Range("A1:M&MaxRow").Copy   'コピーするセルの範囲を指定    '↑ここでエラー。.Worksheets(2).Range("A1:M38").Copy を指定するイメージです。 .Worksheets("統合").Range("A1").PasteSpecial End With End Sub どなたか間違っている箇所のご教示お願い出来ますでしょうか。 どうぞよろしくお願い致します。

  • VBAで行をコピーして別のシートに貼付け

    いつもお世話になっております。 現場登録検索のシートの数値F2の値が 一覧シートにマッチする行を検索し その行を切り取り、終了現場に入力されている 最終行に貼付ける。と言うVBAを作りましたが、 "RangeクラスのSelectメソッドが失敗しました。" 下記が黄色になります。 Sheets("終了現場").Range("A1").Select 解決ができません。 アドバイスをお願い致します。 Private Sub CommandButton7_Click() '終了ボタン '終了行を一覧から探す Worksheets("現場登録検索").Range("F2").Select ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],一覧!C[-5],0)" n = ActiveCell.Value 行 = n Worksheets("一覧").Rows(行).Copy Sheets("終了現場").Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub

  • エクセルVBAでコピーして 手動で貼り付け 

    こん○○は 初心者であちこちからコードをコピペしてなんとかつなぎ合わせているレベルです。 エクセル2002 OS XP Sub copy() i = Worksheets(3).Range("I2")      'I2に適当な数字が入ってる i = i + 1 左上 = "G1" '選択する範囲の左上セル 右下 = "H" & i '   〃   右下セル 範囲 = 左上 & ":" & 右下 Worksheets(3).Range(範囲).copy_ Worksheets(3).Range("n1").PasteSpecial Paste:=xlPasteValues i = (i + 1) / 2 左上2 = "N1" 右下2 = "O" & i 範囲2 = 左上2 & ":" & 右下2 Worksheets(3).Range(範囲2).copy End Sub というコードでコピーした状態にした後手動で他のエクセルやテキストに貼り付けようとしています。ただしシート3は Private Sub auto_Open() ActiveWorkbook.Unprotect Worksheets("Sheet1").Visible = False Worksheets("Sheet3").Visible = False ActiveWorkbook.Protect End Sub でみえなくしています。 こうすると他のエクセルに貼り付けると 貼り付け先のシートが消えてしまいます。消えないようにしたいのですが。 なんとかお知恵を拝借できませんでしょうか?よろしくお願いします。

  • マクロ EXCELの範囲をコピーして貼付け2

    【やりたいこと】 エクセルファイル(test.xls)に複数のシートが存在します。 (1)そのエクセルに新しいシートを1つ挿入しシート名を「統合」とつけます。 (2)シート名に「時」という文字が含まれたシートにある表を範囲指定しコピー (3)「統合」シートに貼り付けます。 ※「時」という文字が含まれたシートは複数あります(不特定) 【問題箇所(エラーになっている箇所)・・★】 「時」という文字が含まれたシートは複数枚あるので「統合シート」に貼付ける際 前に貼り付けた続きから貼り付けたいので「統合」シートの最終行を求め、 貼り付けを行っていきたいのですが、最終行を求める箇所でエラーになります。 度々の質問で申し訳ございませんがどなたかご教示頂けないでしょうか。 よろしくお願い致します。 Sub attendanceJoin() Dim MaxRow As Integer Dim wsNewMaxRow As Integer Dim NewWorkSheet As Worksheet Dim ws As Worksheet Workbooks("test.xls").Activate Set NewWorkSheet = Worksheets.Add() '新しいシートを追加 NewWorkSheet.Name = "統合" '新しく追加したシートに「統合」と名前をつける Worksheets("統合").Range("A1").Value = "NO" 'A1のセルに「NO」と入れる For Each ws In Worksheets If ws.Name Like "*時*" Then MaxRow = Worksheets(ws.Name).Range("A4").End(xlDown).Row wsNewMaxRow = Worksheets("統合").Range("A1").End(xlDown).Row '↑★この行でエラー:最終行を求める箇所 With Workbooks("test.xls") .Worksheets(ws.Name).Range("A5:M" & MaxRow).Copy .Worksheets("統合").Range("A" & wsNewMaxRow + 1).PasteSpecial '求めた最終行の次から貼り付けする。 End With End If Next End Sub

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • EXCEL VBA シートのコピー後処理?

    EXCEL2013使用にてフォーム内ボタンより 下記、受注一覧表シートをコピー→一番左に配置して 処理シートに名前を変更して J列基準の昇順に並び変えようとしていますが ActiveSheet.Name = "処理シート"で コードの実行が中断されましたメッセージが出ます。 ActiveSheet.Name = "処理シート"にブレークポイントを置いて F8で進めていきますと処理実行します。 ユーザーフォームは UserForm1.Show 0で開いております。 どの箇所の修正を行えばいいのか ご教示時お願いいたします。 Private Sub CommandButton1_Click() Worksheets("受注一覧表").Copy Before:=Worksheets(1) ActiveSheet.Name = "処理シート" Worksheets("処理シート").Select Rows("8:2328").Select Range("B8").Activate ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Clear ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Add Key:=Range("J9:J2328") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("処理シート").Sort .SetRange Range("B8:L2328") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B8").Select End Sub

専門家に質問してみよう