Excel VBAで使わない!?Selectを回避する方法とは?

このQ&Aのポイント
  • ExcelのVBAを独学している方にとって、Selectの使用について疑問が浮かぶことがあるかもしれません。本記事では、Selectを使わずにシートの操作を行う方法や、Selectの回避が必要な場面について解説します。
  • Excel VBAでデータの入力やシートの切り替えを行う際、Selectを使用する方法が一般的ですが、実はSelectを使わない方法も存在します。本記事では、Selectを使わずにデータを入力する方法や、シートをアクティブにしなくても良い参照方法について詳しく説明します。
  • Excel VBAでシートの操作を行う際、Selectを使わない方法を探している方も多いかもしれません。本記事では、Selectを回避するための具体的な方法や、Selectを使わないといけない場面について解説します。また、Selectを使わないことによるメリットや注意点についても触れます。Excel VBAの学習を進める上で、Selectの使い方に悩んでいる方は必見の内容です。
回答を見る
  • ベストアンサー

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を使うのを回避するためには・・・ などなど、ご存知でしたら回答お願い致します。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.2

ご提示のコードは、VBAというよりマクロですね。やりたいことを直接やるのではなく、人間がコピーするのだったらこうするなという操作を忠実に再現しようとしているように見えます。 ●どうしてもSelectを使わないといけない場面 通常はありません。強いて言うなら、処理中シートを切り替えながらいろいろやっている様子をみせ、「なんかいろいろやっているんだな」という印象を与えたい時ですね。もしくは、結果だけが同じになればいいというわけではなく、完全に人間と同じ操作をさせたい場合。そんな場合があるのかわかりませんが。 通常はコピーさえできればいいので、人間と同じ方法を忠実に再現させるなどということはしません。そんなことをすると処理が遅くなりますし。 select ActiveSheet copy Paste この辺は普通は使用しません。遅いし、素人っぽく思われます。 ●Selectを使わないデータの入力方法 ●Selectを使わず、シートをアクティブにしなくても良い参照方法 ●Selectを使うのを回避するためには・・・ 例0の書き方から、例1や例2の書き方に変えればOKです。例0や例2の場合には、それだけだと1つのシート内の操作しかできません。あるシートの内容を別のシートに書き込むという場合には例1のような書き方が必要になります。 複数のシートを扱う場合には「どのシート」という指定を省略してしまうとあいまいになりバグを埋め込む原因にもなりかねません。『「どのシート」の「どの部分」』を両方明示した方がいいです。 ご提示のコードを丸ごと書き換えると、例3のような感じにするといいと思います。Dまで選択する必要があるのか、値以外の書式などをコピーする必要があるのかわかりませんので、「A1の値のみをコピーする」という内容で書いています。 いくつかの値をコピーすると言う場合には、詳しくは書きませんが、RangeではなくCellsを使いFor文などで繰り返し処理をするといいでしょう。わからなければ最初は s2.Range("A1").Value = s1.Range("A1").Value s2.Range("B1").Value = s1.Range("B1").Value などと複数行書いていくのがいいと思います。 例0 ------------- WorkSheets("データ").select Range("A1").select ----------------- 例1 ------------- Dim s As Worksheet Set s = Worksheets("データ") s.Range("A1").select ----------------- 例2 ------------- With ThisWorkbook.Sheets("データ") Range("A1").select End With ----------------- 例3 ------------- Dim s1 As Worksheet Dim s2 As Worksheet Set s1 = Worksheets(データ) Set s2 = Worksheets(コピー) s2.Range("A1").Value = s1.Range("A1").Value -----------------

satoron666
質問者

補足

回答ありがとうございます! シート名まで変数にしてしまうと、 色んなシートがあるので変数迷子になってしまいそうなため 今まで変数に格納することは避けてきました。 他の人が見た際に分かりやすいプログラム (他の人が見ても編集できるプログラム)を書きたいと 思ったのですが、やはり難しそうです・・・ 回答ありがとうございました!

その他の回答 (1)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

WorkSheets(データ).select Range("A1").select Range("A:D").select selection.copy ↓ ↓ WorkSheets("データ").Range("A:D").copy Worksheets("コピー").select Range("A1").select ActiveSheet.Paste ↓ ↓ Worksheets("コピー").Range("A1").PasteSpecial つまりは Sub Macro1() Worksheets("データ").Range("A:D").Copy Worksheets("コピー").Range("A1").PasteSpecial End Sub 選択(Select)しなくとも、指定すれば動きます

satoron666
質問者

お礼

回答ありがとうございます。 1つにまとめれば大丈夫!という感じでしょうか? ありがとうございました!

関連するQ&A

  • Excel vba selectが効かない

    2と3の2つのエクセルファイルがあります。縦の列を新しいファイルの横の行に コピーしていきたいプログラムです。 2のファイルの1シート目の"C8:C25" 3のファイルの1シート目の"C9:C65" を新しい1のファイルの1シート目の1行目にコピーするプログラムを 作っていますが1シート目はpasteされるのですが 3のファイル2シート目からselectの指定が"C9:C65"ではなく、B9からQ65の指定になってしまい思ったコピーができません(★のところ)、1シート目はうまくいっているのでどうして3のファイルの2シート目のからうまくいかないかわかりません。 5シートまででテストをしているのですが実際は各々255シートありもってくる列も 12列あります。とりあえずCの列だけ5シートで試してみています。 Dim i As Long Dim N As Long i = 1 N = 1 Do While i <= 5 ''C列''' Workbooks(2).Worksheets(i).Activate   '2のファイル Worksheets(i).Range("C8:C25").Select   'もってくるところ Selection.Copy Workbooks(1).Worksheets(1).Activate   '1新しいファイル Range("C" & N).Select   '貼り付けるところ Selection.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=False, Transpose:=True Workbooks(3).Worksheets(i).Activate   '3のファイル Workbooks(3).Worksheets(i).Range("C9:C65").Select  '★もってくるところ Selection.Copy Workbooks(1).Worksheets(1).Activate   '1新しいファイル Range("U" & N).Select   '貼り付けるところ Selection.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=False, Transpose:=True i=i+1 N=N+1 LOOP

  • エクセル VBA 繰り返し コピー貼り付け

    以下を繰り返し作業をOffsetを使用して行いたいのですがどうすればいいでしょうか? Sheets("Sheet1").Select Range("A1:C1").Select のA1:C1以下へA1000:C1000ぐらいあります。 Sheets("Sheet2").Select Range("G1").Select は貼り付けたセル3つの数字の組み合わせで公式に使う計算期間がまちまちですので公式を張り付けたり出来ません。 D1の解を heets("Sheet1").Select Range("D1").Select に貼り付けてA1:C1以下1000までの結果を評価出来るようにしたいのですが! ' Macro1 Macro Sheets("Sheet1").Select Range("A1:C1").Select Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D1").Select ActiveSheet.Paste Range("A2:C2").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Range("A3:C3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D3").Select ActiveSheet.Paste End Sub よろしくおねがいします。

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • vba 順次記録 

    下記のマクロはツール、マクロ、新しいマクロの記録で作成しました。 順序はa1に ”=RSS|'3315.T'!現在値” 最初から入力しておきます。 1回目a1に楽天のマーケットスピード  (MS) より数字が入力されます a1に入力したすうじをa5とa6にコピーします。 2回目 MS より次の入力が入ります。 a1に入力したすうじをa5にコピーします。 a5,a6 を a6,a7 にコピーします。 3回目 MS より次の入力が入ります。 a1に入力したすうじをa5にコピーします。 a5,a6,a7 を a6,a7,a8 にコピーします。 4回目 MS より次の入力が入ります。 a1に入力したすうじをa5にコピーします。 a5,a6,a7,a8 を a6,a7,a8,a9 にコピーします。 n回目 MS より次の入力が入ります。 a1に入力したすうじをa5にコピーします。 a5,a6,a7,a8,-----a? を a6,a7,a8,a9,-----a? にコピーします。 以後入力有り次第 繰り返し続けて記録したいのです。 下記のマクロはa列に記録ですがb、c、d、と4箇所形式は同じですがデータの違いのが有るのですが a,b,c,d,列入力順序がばらばらなのです a列のみでもお願いします。 Sub M3() Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Copy Range("A5:A6").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5").Select Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5:A6").Select Selection.Copy Range("A6").Select ActiveSheet.Paste Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5:A7").Select Selection.Copy Range("A6").Select ActiveSheet.Paste Range("A5").Select Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5:A8").Select Selection.Copy Range("A6").Select ActiveSheet.Paste Range("A5").Select Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5:A9").Select Selection.Copy Range("A6").Select ActiveSheet.Paste Range("A5").Select Range("A1").Select Selection.Copy Range("A5").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A5:A10").Select Selection.Copy Range("A6").Select ActiveSheet.Paste Range("A5").Select End Sub

  • VBAの勤務割表の式を短く

     月間の勤務割表を作成しています。 1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。 列に日付、行を個人名(max16名)とし1列3行を名前の定義で13種類作成してあります。 別シートの各セルの入力番号に応じて13種類を貼り付けていますが、式を簡単にできませんでしようか?  お教えくださいませんでしょうか?勉強不足は否めませんが。 尚名前の定義は、1行3列に1--で勤務1・""-""で日勤・""公休""で公等にしてあります。 OS Windows7 Office2010 Sub 図形の貼付け2() If Worksheets("メイン").Range("J9").Value Then Select Case Worksheets("メイン").Range("J9").Value 1人-1日 Case 1: ActiveSheet.Range("勤務1").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 2: ActiveSheet.Range("勤務2").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 3: ActiveSheet.Range("勤務3").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 4: ActiveSheet.Range("日勤1").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 5: ActiveSheet.Range("日勤2").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 6: ActiveSheet.Range("日勤3").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False End Select Else Select Case Worksheets("メイン").Range("I9").Value Case 2: ActiveSheet.Range("明け").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 4: ActiveSheet.Range("夜勤").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 5: ActiveSheet.Range("公").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 6: ActiveSheet.Range("有").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 7: ActiveSheet.Range("特").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 8: ActiveSheet.Range("振").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 9: ActiveSheet.Range("欠").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False End Select End If End Sub

  • Excel VBA if文 マクロ強制終了するには?

    現在 2つのbookがあります。 ・データ data.xls ・集計 total.xls ★条件は以下 ・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。 ・sheet名は不特定の名前が付けられています。 ★処理したいマクロ内容 ・data.xls …の各sheet と total.xls 各sheet参照させて マッチしたら処理。 マッチしなかったらマクロ強制終了。 Sub match() Dim i As Integer For i = 1 To Worksheets.Count '任意のbookを指定します Windows("data.xls").Activate sheet_copy = ActiveSheet.Name Sheets(sheet_copy).Select '範囲を選択 コピーします Range("C2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy On Error Resume Next '---前後にシートが無い場合のエラーを無視 ActiveSheet.Next.Select '任意のbook と sheet を指定します Windows("total.xls").Activate sheet_paste = ActiveSheet.Name Sheets(sheet_paste).Select Range("D2").Select If sheet_copy = sheet_paste Then ActiveSheet.Paste ActiveSheet.Next.Select Else MsgBox "sheet miss match error!" '★マクロ強制終了 End If Next i 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]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセル マクロ for next 繰り返し

     マクロは初心者です。  以下のコピーペーストを  for ~ next で3回繰り返すコードを書くには?  変数  処理  回数指定  次に  「データ範囲の指定とコピー貼り付け」になります。   ご教示願えれば幸甚に存じます。    ◎同じ処理を二回例示します。  Range("D2").Select Windows("新規_1502.csv").Activate Range("C2:F" & 最終行).Select  Selection.Copy Windows("sinki 1502_新規.xlsm").Activate ActiveSheet.Paste ActiveSheet.Paste Range("K2").Select Windows("新規_1502.csv").Activate Range("G2:J" & 最終行).Select Selection.Copy Windows("sinki 1502_新規.xlsm").Activate ActiveSheet.Paste ActiveSheet.Paste

  • 【VBA】コピー&複数個所のペースト繰り返し

    下記のように、1つの値をコピーし、別シートの複数個所(同じ列の違う行)へ順次ペーストしたいのですが、貼付けデータやペースト箇所が増えた場合でも対応できるようなVBAを教えてください。 よろしくおねがいいたします。 ========================================================= Sub コピペ() '←1人目をコピー Worksheets("“コピー元シート”").Range("B7").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B9", "B37", "B65", "B93", "B121", "B149", "B177").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←2人目をコピー Worksheets("“コピー元シート”").Range("B8").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B11", "B39", "B67", "B95", "B123", "B151", "B179").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←3個の値をコピー Worksheets("“コピー元シート”").Range("B9").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B13", "B41", "B69", "B97", "B125", "B153", "B181").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←4個の値をコピー Worksheets("“コピー元シート”").Range("B10").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B15", "B43", "B71", "B99", "B127", "B155", "B183").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←5個の値をコピー Worksheets("“コピー元シート”").Range("B11").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B17", "B45", "B73", "B101", "B129", "B157", "B185").Select Selection.PasteSpecial Paste:=xlPasteFormulas End Sub

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

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

専門家に質問してみよう