• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA オブジェクトの指定方法と速度)

Excel VBA オブジェクトの指定方法と速度

mitarashiの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

詳しくないので試してみました dim buf as string buf = Worksheets("Sheet1").Name といった操作を100万回やらせてみました。(Win7Home-64bit,xl2010-32bit,Core-i5 3.2GHz) 1. Worksheets("Sheet1").Name 3.042秒 2. ws.Name          0.107秒 3. Sheet1.Name        0.110秒 実行の最初の数回は捨て、5回の測定値の平均です。 Worksheets("Sheet1")は結構遅いのに驚きました。 2と3は最初dim buf as variantでやったときは殆ど一緒でした。 ご参考まで。 試験したコードは下記の通りです。既に出典は分かりません。 '高分解能パフォーマンスカウンタ用API Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long Sub test() Dim curStartTime As Currency Dim curEndTime As Currency Dim curFreq As Currency Dim ws As Worksheet Dim buf As String Dim i As Long '高分解能パフォーマンスカウンタの周波数を取得 If QueryPerformanceFrequency(curFreq) = 0 Then MsgBox "ハードウェアが高分解能パフォーマンスカウンタをサポートしていません!", vbCritical Exit Sub End If Set ws = Worksheets("Sheet1") '開始時刻を取得 Call QueryPerformanceCounter(curStartTime) For i = 1 To 1000000 buf = Worksheets("Sheet1").Name ' buf = Sheet1.Name ' buf = ws.Name Next i '終了時刻を取得 Call QueryPerformanceCounter(curEndTime) '結果の表示 Debug.Print (curEndTime - curStartTime) / curFreq End Sub

ii93
質問者

お礼

ご回答ありがとうございます! 2と3は変わらないのですね! 2はオブジェクト変数ですが、もしかして3もオブジェクト変数なのでしょうか。。。?

関連するQ&A

  • Excel VBA 定数にオブジェクトを指定したい

    Excel VBA 定数にオブジェクトを指定したい いつもお世話になりますm(__)m Excel VBAで、定数としてオブジェクトの指定はできないのでしょうか? 例えば、WorkSheets("Sheet1")を定数「Srt1」として設定したいのですが、  Public Const Srt1 As Object = Worksheets("Sheet1") としても「定数のデータ型が不正です」とエラーがでます。 例えば、セルに値をセットする時に Worksheets("Sheet1").Range("A1").Value="あああ" Worksheets("Sheet1").Range("A2").Value="いいい" Worksheets("Sheet1").Range("A3").Value="ううう" と書きますが、これを Srt1.Range("A1").Value="あああ" Srt1.Range("A2").Value="いいい" Srt1.Range("A3").Value="ううう" と書ければプログラムも見やすく、書きやすくなると思いました。 プログラムの最初に Dim Srt1 As Object Set Srt1 = Worksheets("Sheet1") とすれば使えるのですが、複数のシート名をまずは定数として登録したいと思っていますが、オブジェクト(ワークシート名)は定数として登録することは出来ないのでしょうか? お詳しいかた、是非ともご教授お願い致しますm(__)m

  • エクセルVBAでFor each文

    下記のようなコードを書きたいのですが「オブジェクトが必要です」というエラーが 出力されてしまいできないようです。何か代替案はありますでしょうか。 --- dim ws as worksheet with thisworkbook for each ws in array(.worksheets(1),.worksheets(2),.worksheets(3)) with ws 'ここに処理を書く end with next ws end with --- ちなみにこのbookにある全てワークシートで処理を回したいわけではなく 特定のシートのみで処理をしたいです。 エクセル2003です。 よろしくお願いします。

  • エクセルVBE実行時のエラーの意味とその対処方法

    Windows Vistaでエクセル2007を使用しています。 添付の画像のエクセルファイルのVBEに 本文最後のコードを記述して実行させようとすると 下記のようなエラーが出ます。 (実行内容はsheet1の表の内容を sheet2で円グラフとして作成することです) 『実行時エラー'91' オブジェクト変数またはWithブロック変数が設定されてません』 ○質問 1.上記のメッセージの意味を教えてください 2.デバックすると10行目の 『Set Grp1 = WS2.ChartObjects.Add(50, 50, 320, 200)』 がデバックされます。この記述のどこがおかしかったのでしょうか? エクセルVBAにお詳しい方、何とぞご教示お願いします。 なお、コードの内容は以下の通りです。 Sub グラフ作成() Dim WS1 As Worksheet Dim WS2 As Worksheet Dim Grp1 As ChartObject Set WS = Worksheets("sheet1") Set WS = Worksheets("sheet2") Set Grp1 = WS2.ChartObjects.Add(50, 50, 320, 200) Grp1.Chart.ChartType = xl3DPieExploded Grp1.Chart.SetSourceData Source:=WS1.Range("C3:D14"), PlotBy:=xlColumns Worksheets("sheet2").Activate Set WS1 = Nothing Set WS2 = Nothing Set Grp1 = Nothing End Sub

  • EXCEL VBAでworksheetに変数を使って指定は出来ますか?

    EXCEL VBAでworksheetに変数を使って指定は出来ますか? たくさんのワークシートに処理結果を出したいのですが。

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • 【Excel VBA】 WorksheetやRangeオブジェクトとして宣言した変数の開放は必要でしょうか?

    こんばんは。 プロシージャレベルで宣言したWorksheetやRangeなどのオブジェクト変数に対し、 プロシージャを終了する直前に、 Set ○=Nothing を実行して、変数(オブジェクトへの参照)を開放する処理を習慣的行っていました。 これは、絶対に必要な処理なのでしょうか? 開放しないことで不具合が出るケースとはどういう場合なのでしょうか? どなたか、ご教示いただけないでしょうか。 よろしくお願いいたします。 <例> Sub test()   Dim Ws1 As Worksheet      Set Ws1 = Worksheets("Sheet1")   '処理内容      Set Ws1 = Nothing End Sub 尚、CreateObject関数で作成したオブジェクトへの参照などではなく、 あくまでもWorksheetやRangeなどの話です。

  • VBA Worksheetsはプロパティなの?

    (株)C&R研究所発行 Excel VBA逆引きハンドブック 著者 蒲生睦男 234ページを引用します。 ----- ワークシートを参照するには「Worksheets」プロパティを使います。「Worksheets」プロパティは、指定されたブックのすべてのワークシートを表す「Sheets」コレクションを返します。 ----- 私は今までWorksheetsはコレクションだと思ってました。つまりワークシートの集合であると。違うのですか?さらにプロパティはオブジェクトの性質を表わすもので、例えばCellのプロパティであればValue, Colour等です。では、Worksheetsは何のプロパティなのでしょうか?Workbookのプロパティですか?もしそうなら、他にはどんなプロパティがあるのですか?さらに上記引用で「返す」とありますが、返すってなんですか?ファンクションプロシージャの戻り値を返す、みたいな表現はありますがここでの「返す」の意味がよくわかりません。 私の現状認識は以下のものです。どこか誤ってますか? Worksheetsはワークシートの集合体つまりコレクションであり、ワークシートオブジェクトでもある。オブジェクトであるので、性質を表わすプロパティではない。 VBAの構文で Workbook.Worksheet.Range のような表現はよく使いますが、ひょっとして後ろにくっつくのは全部プロパティなのですか?ちょっとよくわかりません。

  • エクセルVBAについて

    こんばんは。エクセルVBAについてアドバイスをお願いします。 エクセルのシートをNotesにオブジェクトとして貼り付けて使用しています。 エクセルファイルを開いたときに「シートA」を表示させましてその後そのシート上のデータを参照しながら別のシート上で作業したいと思っています。 しかしファイルを開くと 「'Sheets'メソッドは失敗しました'Globalオブジェクト'」というメッセージが表示されてしまいます。 エラーがでた場所は下記の※印の場所です。 =============================================== Dim WORK As Long Dim DATA As Object Set DATA = Worksheets("シートA").Range("A1") ※ WORK = DATA.Value =============================================== 情報が足りない場合は追記お願いします。 アドバイスお願い致します。

  • 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

  • VBA オブジェクト型使用の利点は?

    例えばワークシートの表現を考えます。 自分は今まで以下のようにしてました。 Dim sheet1 As String sheet1=Worksheets(1).Name Worksheets(sheet1).Activate オブジェクト型宣言を用いて以下のように書き換えられます。 Dim sheet1 As object set sheet1=Worksheets(1) sheet1.Activate ソースコードとしてはスッキリしますが、見た目以外でどのようなメリットがあるのですか?