2017-12-26 19 views
0

新しいエクセルをハイライトしようとしていますが、古いエクセルと同じ方法でデータが大きくなります。範囲内の関数であればカウントし、見つけてください。しかし、 "オブジェクトはエラーを見つけられません"と表示され続けます。範囲オブジェクトをうまく定義して以来、実際には得られません。私のコードの一部です。RangSe1オブジェクトを定義した後、 "RangSe1(1,1).Activate"でデバッグしようとしましたが、ここから424のエラーが出ます。私は本当に混乱しています。実行時エラー:424:範囲に達して範囲データを使用しようとするとオブジェクトが必要になる

Sub Morningsmall() 

Dim strfile As String 
Dim iLastrow, iColor, iFind, iLastrow1, iLastrow2, iLastrow3, iLastrow4, iRow As Long 
Dim RangSe1, RangSo1, RangSe2, RangSo2, RangS As Range 


Dim wbLastday, wbToday As Workbook 
Dim wsSettle1, wsSettle2, wsSophis1, wsSophis2 As Worksheet 

    With Application 

     .ScreenUpdating = False 
     .EnableEvents = False 
     .Calculate 
     .Calculation = xlCalculationManual 
     .DisplayStatusBar = False 
    End With 


    'Open yesterday's file 
    MsgBox "Open Yesterday's Settlement Report" 
    strfile = Application.GetOpenFilename 
    If strfile <> "False" Then Workbooks.Open strfile 

Set wbLastday = ActiveWorkbook 
Set wsSettle1 = wbLastday.Sheets("SettlementReport") 
Set wsSophis1 = wbLastday.Sheets("Sophis") 

iLastrow1 = wsSettle1.Cells(wsSettle1.Rows.Count, 1).End(xlUp).Row 
iLastrow2 = wsSophis1.Cells(wsSophis1.Rows.Count, 1).End(xlUp).Row 

RangSe1 = wsSettle1.Range("A1:AQ" & iLastrow1) 
RangSo1 = wsSophis1.Range("A1:AJ" & iLastrow2) 


RangSe1(1, 1).Activate 

... 
... 
... 


For i = 2 To iLastrow3 
    iFind = RangSe2(i, 1) 
    'a = Application.WorksheetFunction.CountIf(Rang, iFind) 
    If Application.WorksheetFunction.CountIf(wsSettle1, iFind) > 0 Then 

    'range1.Find("test id", LookIn:=xlValues) 
     If RangSe1(wsSettle1.Cells.Find(what:=iFind).Row, 6) = RangSe2(i,   6)  Then 
     iColor = RangSe1.Find(what:=iFind).Interior.Color 
      If iColor <> 16777215 Then 
       wsSettle2.Rows(i).Interior.Color = iColor 
      End If 
     End If 
End If 

... 
... 
... 
+2

あるべきSetキーワードを使用していないあなたは、 'として' RangSE1'を宣言しましたあなたはそれを 'Range'として使用しようとしているのを知らないので、 – YowE3K

答えて

1

Dim RangSe1 
'... 
RangSe1 = wsSettle1.Range("A1:AQ" & iLastrow1) 

1 To iLastrow1, 1 To 43として次元Variant配列を作成します

Dim RangSe1 As Variant 
'... 
RangSe1 = wsSettle1.Range("A1:AQ" & iLastrow1).Value 

と同等であると言ってあなたのライン。配列の(1, 1)番目の位置にActivateメソッドを使用することはできません。これは、配列がオブジェクトではないため、メソッドまたはプロパティを持たないためです。


あなたはあなたのコードが何を期待しないために原因となっている2つの主要なミスがあります。

Dim RangSe1, RangSo1, RangSe2, RangSo2, RangS As Range 

は同等です:ので、あなたが正しくあなたの変数を定義していない

1)

Dim RangSe1 As Variant, RangSo1 As Variant, RangSe2 As Variant, RangSo2 As Variant, RangS As Range 

あなたは使用する必要があります。

Dim RangSe1 As Range, RangSo1 As Range, RangSe2 As Range, RangSo2 As Range, RangS As Range 

2)あなたはとてもあなたのRangeオブジェクトへの参照を割り当てるときに、例えば、

RangSe1 = wsSettle1.Range("A1:AQ" & iLastrow1) 

Set RangSe1 = wsSettle1.Range("A1:AQ" & iLastrow1) 
+0

こんにちはそれは私の質問をとてもうまく解決します。ありがとう!私はなぜ一緒に定義することで範囲オブジェクトをすべての範囲オブジェクトとして定義できないのだろうか? –

+0

そして私は150000のデータセットを持っています。この場合、私が範囲によってループしても、私の表情はいつも詰まってしまいます。とにかく5分以内にループプロセスを締め付けることができますか? –

+1

@SusanLiu「私はなぜ一緒に定義することで範囲オブジェクトをすべての範囲オブジェクトとして定義できないのだろうか? - あなたは 'Dim x、y、z As Range'を行うことができますが、VBAによって' Dim x As Variant、y As Variant、 'As As Range'として扱われます。 'As型'宣言を含まない場合、VBAは変数が 'Variant'として宣言されるものとみなします。したがって、複数の変数をすべて 'Range'オブジェクトとして宣言したい場合、' As Range'、つまり 'Dim x As Range、y As Range、z As Range'のすべてを宣言する必要があります。 – YowE3K

関連する問題