VBAでコピーした時コピー元のシートをアクティブ等

このQ&Aのポイント
  • VBAを使用してシートをコピーする際、コピー元のシートがアクティブになるようにしたいです。
  • 二回目以降にコピー作業を行うと、正常に動作しない現象が発生します。
  • 解決方法を教えていただきたいです。
回答を見る
  • ベストアンサー

VBAでコピーした時コピー元のシートをアクティブ等

いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記で御指導いただいたばかりです。 http://okwave.jp/qa/q8787962.html 二つ質問があります。 1 「元本」のシートをコピーした時、コピー先がアクティブになります。 これを「元本」シートがいつもアクティブになるようにしたいのですが。 2 添付図のように最初にコピーの作業をした時は上手くゆくのですが二回目以降でこのボタンをクリックすると図のようになります。 もう一度クリックすると作動します。 同作業を繰り返すと同現象が発生します。 誠に恐れ入りますが 「1 と 2」の解決方法を御指導いただけないでしょうか。 参考に Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName Range("A2").Select Dim myBut As Object For Each myBut In ActiveSheet.Buttons If myBut.Caption = "SheetCopy" Then myBut.Delete Next End Sub

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

  • ベストアンサー
  • Bloodhand
  • ベストアンサー率60% (18/30)
回答No.1

最後の End subの直前にでも Sheets("元本").Select を挿入することで1は解決するでしょう。 でも2の方は再現できませんでしたのでわかりません。

dorasuke
質問者

お礼

御回答をありがとうございました。 2 の方は色々試しましたがうまく行かないのであきらめました。 その対策として Ctrl + c で対応することにしました。 お陰様で、 元本 をアクティブにするのは上手くできました。

その他の回答 (1)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>「元本」シートがいつもアクティブになるようにしたいのですが。 エクセルの仕様でコピーされたシートがアクティブになりますので コピー後、>「元本」シートをアクティブにすれば良いでしょう >2 添付図のように最初にコピー・・・ こちらでは、そのような現象は確認できませんでした。 Sub SheetCopy()   Dim NewSheetName As String   Dim myBut As Object   NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください")   Application.ScreenUpdating = False   Sheets("元本").Copy After:=Sheets(1)   With ActiveSheet     .Name = NewSheetName     .Range("A1").FormulaR1C1 = NewSheetName     .Range("A2").Select     For Each myBut In .Buttons       If myBut.Caption = "SheetCopy" Then myBut.Delete     Next   End With   Sheets("元本").Activate   Application.ScreenUpdating = True End Sub

dorasuke
質問者

お礼

御回答をありがとうございました。 2 の方は色々試しましたがうまく行かないのであきらめました。 その対策として Ctrl + c で対応することにしました。 お陰様で、 元本 をアクティブにするのは上手くできました。

関連するQ&A

  • シートをコピーの時二つのコマンドボタン一つのみに

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 コピーしようとするシートには2ヶのコマンドボタンがあります。 2つのコマンドボタンとは下記の 「1 と 2」です。 コピーされたシートのコマンドボタン(SheetCopy)は不必要になり、 下記の 1 に↓の記述を追加したのですが二つのコマンドボタンが削除されました。 ActiveSheet.DrawingObjects.Delete 「2 クリアー」ボタンだけを残すには ↑ どういう具合に記述すればいいかを御指導いただけませんでしょうか。 宜しくお願いいたします。 参考に 1 コマンドボタン名「SheetCopy」 Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする ' 2014/10/12 dorasuke ' Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName ActiveSheet.DrawingObjects.Delete Range("A2").Select End Sub 2 コマンドボタン名「クリアー」 Sub ClearCell() Range("K3:S32").ClearContents End Sub

  • VBA シートをコピーした時、同名の場合は注意喚起

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで例えば、 「1018」というシートが既に存在していて新たに「1018」を作成しようとした時に重複の注意喚起メッセ―ジを出すには下記のマクロにどうすればいいか御指導いただけませんでしょうか。 注意喚起メッセージは  「既に、同名のシートがあり再度入力して下さい。」 ※If MsgBox("既に、同名の シートがあり再度入力して下さい。") 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") Sheets("元本").Copy After:=Sheets("元本") With ActiveSheet .Name = NewSheetName With .Range("A1") .NumberFormatLocal = "0000" .Value = NewSheetName End With .OLEObjects("CommandButton1").Delete .Range("A2").Select End With Sheets("元本").Activate Application.ScreenUpdating = True End Sub

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select 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のところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • コマンドボタンをクリックしても作動せず

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで  1 シート「元本」のコピーをコマンドボタンをクリックしても作動しません。    ボタンの所にポメイントを当てても十字に変化して固まった状態なります。  2  K3:S32の範囲で○や△がWクリックしても値を返しません。 このブックの他にはいくつかマクロがありそれらは作動しこの「元本」の下記のマクロ のみ作動しません。 今までは作動していたのですがなぜなんでしょうか。 この不具合をどうすればいいか御指導いただけませんでしょまうか。 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String Dim c As Object Dim MatchFLG As Boolean Do MatchFLG = False NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で4桁の新しいシート名を入力してください。例:1月1日を0101のように") If StrPtr(NewSheetName) = 0 Then MsgBox "キャンセルします", vbInformation Exit Sub ElseIf NewSheetName = "" Then MsgBox "未入力です", vbExclamation Exit Sub End If For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名のシートがあり再度入力し直して下さい。"), vbExclamation Exit For End If Next Loop Until MatchFLG = False Sheets("元本").Copy After:=Sheets("元本") With ActiveSheet .Name = NewSheetName With .Range("A1") .NumberFormatLocal = "0000" .Value = NewSheetName End With .OLEObjects("CommandButton1").Delete .Range("A2").Select End With Sheets("元本").Activate Application.ScreenUpdating = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Intersect(Target, Range("K3:S32")) If Not myRange Is Nothing Then Select Case Target.Value Case "" Target.Value = "○" Case "○" Target.Value = "△" Case Else Target.ClearContents End Select Cancel = True End If End Sub

  • エクセルVBA全シートに差し込みマクロ構文

    Sheets("震圧データ").Select MsgBox "新規ブックに年月分けて" & vbCrLf & "震圧データを転記します、" & vbCrLf & "お待ちください。" Dim c As Range Dim i As Integer Dim LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False Workbooks.Add With ThisWorkbook.Sheets("震圧データ") For Each c In .Range(.Cells(4, "A"), .Cells(Rows.Count, "A").End(xlUp)) If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" If c.Row - 2 > Sheets.Count Then Worksheets.Add after:=Worksheets(Worksheets.Count) Else Sheets(c.Row - 2).Select End If ActiveSheet.Name = NewSheetName Sheets(NewSheetName).Range("A1").Value = "年月日" Sheets(NewSheetName).Range("B1").Value = "曜日" Sheets(NewSheetName).Range("C1").Value = "A" Sheets(NewSheetName).Range("D1").Value = "B" Sheets(NewSheetName).Range("E1").Value = "C" Sheets(NewSheetName).Range("F1").Value = "時間" Sheets(NewSheetName).Range("G1").Value = "状態" Sheets(NewSheetName).Range("I1").Value = "No.1" Sheets(NewSheetName).Range("I2").Value = "記録者" Sheets(NewSheetName).Range("I3").Value = "氏名:" Sheets(NewSheetName).Range("I4").Value = "=IF(ISBLANK(A4),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I5").Value = "=""転載日""" Sheets(NewSheetName).Range("I6").Value = "=TODAY()" Sheets(NewSheetName).Range("I56").Value = "=IF(ISBLANK(A56),"""",""No.2"")" Sheets(NewSheetName).Range("I57").Value = "=IF(ISBLANK(A56),"""",""記録者"")" Sheets(NewSheetName).Range("I58").Value = "=IF(ISBLANK(A56),"""", ""氏名:"")" Sheets(NewSheetName).Range("I59").Value = "=IF(ISBLANK(A56),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I60").Value = "=IF(ISBLANK(A56),"""",""転載日"")" Sheets(NewSheetName).Range("I61").Value = "=IF(ISBLANK(A56),"""",TODAY())" Sheets(NewSheetName).Range("I111").Value = "=IF(ISBLANK(A111),"""",""No.3"")" Sheets(NewSheetName).Range("I112").Value = "=IF(ISBLANK(A111),"""",""記録者"")" Sheets(NewSheetName).Range("I113").Value = "=IF(ISBLANK(A111),"""", ""氏名:"")" Sheets(NewSheetName).Range("I114").Value = "=IF(ISBLANK(A111),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I115").Value = "=IF(ISBLANK(A111),"""",""転載日"")" Sheets(NewSheetName).Range("I116").Value = "=IF(ISBLANK(A111),"""",TODAY())" Sheets(NewSheetName).Range("I166").Value = "=IF(ISBLANK(A166),"""",""No.4"")" Sheets(NewSheetName).Range("I167").Value = "=IF(ISBLANK(A166),"""",""記録者"")" Sheets(NewSheetName).Range("I168").Value = "=IF(ISBLANK(A166),"""", ""氏名"")" Sheets(NewSheetName).Range("I169").Value = "=IF(ISBLANK(A166),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I170").Value = "=IF(ISBLANK(A166),"""",""転載日"")" Sheets(NewSheetName).Range("I171").Value = "=IF(ISBLANK(A166),"""",TODAY())" Sheets(NewSheetName).Range("H1").Value = "提出済○" Sheets(NewSheetName).Range("A57").Select Range("I6,I61,I116").Select Range("I6,I61,I116,I171").Select Selection.NumberFormatLocal = "yyyy/m/d" Columns("F:F").Select Selection.NumberFormatLocal = "[$-409]h:mm AM/PM;@" Range("G1").Select With Selection .HorizontalAlignment = xlCenter End With LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 8).Value = .Cells(c.Row, "A").Resize(1, 8).Value Sheets(NewSheetName).Columns("A:I").EntireColumn.AutoFit Next 新規ブック最終シートのみ適用できますが他の月別シートに適用できておりません '↓どのような構文にしたら適用されるのでしょうか?ここからが質問です↓ If Sheets(NewSheetName).Range("A56") = "" Then Range("I56:I171").Delete Else Sheets(NewSheetName).Range("A56").Value = "年月日" Sheets(NewSheetName).Range("B56").Value = "曜日" Sheets(NewSheetName).Range("C56").Value = "A" Sheets(NewSheetName).Range("D56").Value = "B" Sheets(NewSheetName).Range("E56").Value = "C" Sheets(NewSheetName).Range("F56").Value = "時間" Sheets(NewSheetName).Range("G56").Value = "状態" End If 'ここまで! どなたかご教示お願いします .Activate End With

  • VBA シートを別ブックの先頭・一番左にコピー

    このシート(例Sheet1)を別ブックの先頭・一番左にコピーしたいのです。 下記のコードは一番右にコピーです。 宜しくお願いします。 Sub SheetCopy5() Dim bk As Workbook  Set bk = Workbooks("コピー先のブック.xlsx")  ActiveSheet.Copy _    After:=bk.Sheets(bk.Sheets.Count) End Sub

  • EXCELのVBAですが。

    EXCELのVBAですが。 Sub macro1() Dim mycnt As Integer Dim sheet_name1 As String Sheets("kekka").Select Range("A1").Select Sheets("shiji").Select mycnt = Range("B1").Value sheet_name1 = Range("c" & mycnt) Sheets("kekka").Select Sheets("kekka").name = sheet_name1 Sheets("kansuke").Select Sheets("kansuke").Copy Before:=Workbooks("2007年報告.xls").Sheets(3) End Sub (やりたいこと) B1に入っている数値でC1からC10に入っているあるシートの名前(たとえばkansukeとする)を取り、その名前で kekkaというシート名をkansukeという名前に変える。 名前を変えたkansukeというシートを別の2007年報告というbookにコピーを転送する。 (質問)上のコードで実はkansukeと書いてあるところは,B1の値次第で当然いろいろに 変化するため、そのシート名にとらわれない書き方をしたいのですがどう記述すればいいのか わかりません。以上お願いします。

  • VBAデータ元から新規ブックに出力

    現在のブック内に出力されるとメモリの都合上時間がかかりすぎますそこで新規ブック1個に出力する構文を教えていただきたいのですが、宜しくお願いします。 Sub 1111() Dim c As Range Dim i As Integer, LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False NewSheetName = "" With Sheets("データ元") For Each c In .Range(.Cells(3, "B"), .Cells(Rows.Count, "B").End(xlUp)) MatchFlag = False If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" For i = 1 To Worksheets.Count If Sheets(i).Name = NewSheetName Then Sheets(i).Cells.ClearContents MatchFlag = True Exit For End If Next i If MatchFlag = False Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = NewSheetName End If End If LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 6).Value = .Cells(c.Row, "A").Resize(1, 6).Value Sheets(NewSheetName).Columns("A:F").EntireColumn.AutoFit '↑A列からF列まで自動幅調整してます Next .Activate End With Application.ScreenUpdating = True MsgBox "終了しました", vbInformation End Sub

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

専門家に質問してみよう