2017-09-20 5 views
2

私はコピーしてSheet1からSheet3への一意の値を貼り付けるVBAを持っています。しかし、私はVBAを実行するときにランタイムエラー438を取得します。 私のVBAは、次のようになります。エラーが発生しますThisWoorkbookランタイムエラー438

Sub UniqueList() 

Application.ScreenUpdating = False 
Dim lastrow As Long 
Dim i As Long 
Dim dictionary As Object 
Set dictionary = CreateObject("scripting.dictionary") 

ThisWorkbook.Sheet1.Activate 
lastrow = Sheet1.Cells(Rows.Count, "M").End(xlUp).Row 

On Error Resume Next 
For i = 1 To lastrow 
    If Len(Cells(i, "M")) <> 0 Then 
     dictionary.Add Cells(i, "M").Value, 1 
    End If 
Next 

Sheet3.Range("a2").Resize(dictionary.Count).Value = _ 
Application.Transpose(dictionary.keys) 

Application.ScreenUpdating = True 
MsgBox dictionary.Count & " unique cell(s) were found and copied." 

End Sub 

行は次のようになります。

ThisWorkbook.Sheet1.Activate 

私はシート3からボタンを使用してVBAを実行します。しかし、私はまた、AltF8とAltF11を使ってシート1を開いて実行しようとしましたが、何も動作しません。私は解決策

+4

コードが書かれている方法は、単に 'ThisWorkbook.Sheet1を削除することができます。活性化 '行。シートをメンバオブジェクトで動作させるために 'Activate 'する必要はありません。しかし、作業しているオブジェクトを修飾することがベストプラクティスです。たとえば、 'Cells(i、" M ")'を 'Sheet3.Cells(i、" M ")'に変更します。 'Sheet1'と' Sheet1'の使用はVBAシートのオブジェクト名を仮定しています。これは 'Worksheets(" Sheet1' ")とは異なる構文です。 –

答えて

4

Sheet1を助けることができる人はThisWorkbookのメンバーがないされていることを願っていますので、私はそのエラーを取得する理由

イム本当にわかりません。 ThisWorkbookWorkbookインスタンスであり、Workbookオブジェクトは、Worksheetsコレクション内のすべてのワークシートに対して「動的メンバー」を公開しません。したがって、エラー438,オブジェクトはプロパティまたはメソッドをサポートしていません。

Sheet1は、[私は推測] ThisWorkbookのワークシートのCodeNameです:それは、文書モジュールの(Name)プロパティにちなんで名付けられ、VBAが便利作成グローバル・スコープWorksheetオブジェクトです。

そのSheet1オブジェクトにはParentというプロパティがあります。すべてのWorksheetオブジェクトのように、それはすでには、それが属する何Workbookインスタンスを知っている:

Debug.Print Sheet1.Parent Is ThisWorkbook 

は、IntelliSenseは(Sheet1メンバーをリストない)ことを教えしようとしている - それが言うことに耳を傾けます!

このよう命令を固定し、言っ

Sheet1.Activate 

... 他の問題解決しない:非修飾Cells呼び出しが参照することができる唯一のように、あなたがActivateを使用していることを

For i = 1 To lastrow 
    If Len(Cells(i, "M")) <> 0 Then 
     dictionary.Add Cells(i, "M").Value, 1 
    End If 
Next 
:その特定のワークシートへ

代わりに、は彼らにを修飾:

For i = 1 To lastrow 
    If Len(Sheet1.Cells(i, "M")) <> 0 Then 
     dictionary.Add Sheet1.Cells(i, "M").Value, 1 
    End If 
Next 

そしてActivate通話が完全に無駄になってしまいます。

これらの暗黙的なActiveSheetの参照は簡単に導入でき、見つけにくいものです。あなたがそれら(および他のもの)を見つけることができますRubberduck(私が管理VBEアドインプロジェクトは、オープンソースは):

"Implicit reference to ActiveSheet" inspection results

+0

あなたの助けを借りて驚くべきことに感謝します! set sht = ThisWorkbookを使用して、activateを削除すると問題が解決しました! :) –