• ベストアンサー

エクセルVBAについて

Sub a() Sheets("Sheet1").Select End Sub Sub b() Worksheets("Sheet1").Select End Sub どちらコードもSheet1を選択しますが 「こちらを使うべき!」ってありますか? 独学のため、SheetsとWorksheetsの違いがわかりません。 ご教授よろしくお願いします。

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

  • ベストアンサー
  • CF-Gum58
  • ベストアンサー率75% (6/8)
回答No.2

こんにちは。 表計算に使うシートが、ワークシートです。 シートにはワークシート以外にグラフシート等がありますが、 それらはシートの種類の一つです。 表計算のシートから指定するのがWorksheets、 シート全般から指定するのがSheetsです。 なので、表計算のシートの指定ならどちらでも同じ意味ですし、 どっちが良いというのは特にありません。 ただ、グラフシート等を使う場合はその点を意識する必要があります。

a983742qyuikj
質問者

お礼

シート ・ ワークシート ・ グラフシート という事ですね。グラフシートがある時は気を付けます。ありがとうございました。

その他の回答 (1)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

ヘルプには、 Sheets 指定されたブックまたは作業中のブックにあるすべてのシートのコレクションです。 Worksheets 指定されたブックまたは作業中のブックにあるすべての Worksheet オブジェクトのコレクションです。各 Worksheet オブジェクトはワークシートを表します。 備考 Sheets コレクションには、ブックにあるすべてのシート (グラフ シート、ワークシートの両方) が含まれています。 とあります。 わかるでしょうか。 Sheetsの中にWorksheetsが含まれています。 「セル」のあるのがWorksheetsです。 グラフシートはWorksheetsでは指定できません。

a983742qyuikj
質問者

お礼

Sheets=ワークシート,グラフシートをなどのすべてのシートの事 Worksheets=グラフシートではないシート なのですね。 新規でエクセルを立ち上げた時にデフォルトである Sheet1、Sheet2、Sheet3は 「Sheets」ではなく「Worksheets」なのですね。 とてもわかりやすい説明ありがとうございます。

関連するQ&A

  • エクセル 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のところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセル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    ・    ・    ・    ・    ・

  • 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の値次第で当然いろいろに 変化するため、そのシート名にとらわれない書き方をしたいのですがどう記述すればいいのか わかりません。以上お願いします。

  • excel 2003でCSVファイルを読み込むVBA

    現在CSVファイルを読み込むマクロを作成してますが、レベルが低く下記載のコードで作業を行ってます。 皆様の技術をお借りしたいので、ご教授宜しくお願い致します。 ※現在のコードです。 CommandButton1でフォルダーを開いてcsvファイルを選択し、toolをsheetに追加してます。それから、CommandButton3で追加されたtoolからB14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付けています。 結構手間が係り作業に時間がかかってしまいます。 そこで、改良をしたいと思いますのでご教授お願い致します。 ※改良したいポイント (1)同じフォルダー内のTOOL.CSVをフォルダーを開かず直接commandButton1でSheetに追加する。 (2)Sheet2にコピーされたデーターから(B14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付ける。 (commandButton3はなくしたいと思ってます) 以上です。 宜しくお願い致します。 --------------------------------------------------------- Private Sub CommandButton1_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Myname = ActiveWorkbook.Name CSV_Filename = Application.GetOpenFilename("CSVファイル(*.CSV;*.prn),*.CSV;*.prn", , "CSVファイルを開く") If CSV_Filename = False Then Exit Sub Workbooks.Open CSV_Filename CSV_SheetName = Worksheets(1).Name Sheets(CSV_SheetName).Move after:=Workbooks(Myname).Sheets(Sheets.Count + 1) Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub ---------------------------------------------------------------- Private Sub CommandButton3_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("(TOOL)").Select Sheets("(TOOL)").Range("B14:C14").Select Sheets("(TOOL)").Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("CSV Road").Select Sheets("CSV Road").Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub -------------------------------------------------------------

  • ExcelのVBAです。

    先日お答えいただいたVBAなんですが、 Sub Macro1() Sheets("Sheet1").Select Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("Sheet3").Select Range("A1").Select ActiveSheet.Paste Selection.End(xlDown).Select Application.CutCopyMode = False Do Selection.Insert Shift:=xlDown Selection.End(xlUp).Select Loop Until ActiveCell.Address = "$A$1" End Sub というのを使用させて頂いてます。 これを、コピー先のものを上書きせずに、コピーされたものがあれば表示させるといった風に出来ないでしょうか? 例  A    A 1 a 1 2 b → 2あ 3 c 3 右から左に一行間隔で別シートに表示させたいのですが、  A  1 a 2 あ 3 b 4 5 b という結果にしたいのです。 拙い文章で申し訳ないのですが、教えて頂きたいです。

  • EXCEL VBA オートフィルで別シートへコピー

    EXCEL VBA オートフィルで別シートへコピー しようとしたら、うまくいきません 別々に書くとうまくいくのですが コードを一緒にするとうまくいきません? コード *********************************************** Sub 抽出別シート() Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1" '1時間以下の8列目のをフィルター end sub sub カレントで別シートへコピー() Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")   'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** このように書くとうまくいくのですが これを一緒に書くと別シートへコピーがうまくいきません。 全てコピーされてしまいます +++++++++++++++++++++++++++++++++++++++++++++++ 一緒にしたコードです +++++++++++++++++++++++++++++++++++++++++++++++ *********************************************** Sub 抽出別シート() '1h以下をを抽出別シートへコピー Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1"    '1時間以下の8列目のをフィルター Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")    'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** 意味が分かりませんどなたかおしえていただけませんでしょうか? よろしくお願いいたします

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • Excel VBA With ~ End With

    Excel VBA With ~ End Withを使わずに記述するには Sheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力して、 Sub test1()  With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart   .ChartType = xlBarStacked100   .SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows  End With End Sub を実行すると横棒グラフが1個表示されますが、 これを、With ~ End Withを使わずに記述すると Sub test2()  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.ChartType = xlBarStacked100  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows End Sub というようになると思いますが、 実行すると縦棒が2個表示されてしまって同じ結果になりません。 なぜなのでしょうか。 test1を、With ~ End Withを使わずに記述するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。(Windows10,Excel2016)

  • VBA コマンドボタンにおけるコードについて

    下記のようなコードを作成しました。 これを簡略化するにはどうすれば良いのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("sheet2").Select Select Case UserForm1.ComboBox1.Text Case Is = Sheets("sheet2").Range("A1").Value Sheets("sheet2").Range("B1").Value = "X" Case Is = Sheets("sheet2").Range("A2").Value Sheets("sheet2").Range("B2").Value = "X" Case Is = Sheets("sheet2").Range("A3").Value Sheets("sheet2").Range("B3").Value = "X" Case Is = Sheets("sheet2").Range("A4").Value Sheets("sheet2").Range("B4").Value = "X" Case Is = Sheets("sheet2").Range("A5").Value Sheets("sheet2").Range("B5").Value = "X" ・ ・ ・ End Select End Sub

専門家に質問してみよう