2017-09-04 18 views
1

所以我在我的代碼中遇到FindNext問題,它的vba看不到我在循環外部創建的對象。VBA看不到我在循環外創建的對象

Sub Macro1() 

'Dwa skoroszyty 
Dim ws1, ws2 As Worksheet 
Set ws1 = Sheets("Sheet1") 
Set ws2 = Sheets("Wynik") 

Dim NaglowekWiersz, NaglowekKolumna As Integer 
NaglowekKolumna = 1 
NaglowekWiersz = 1 
Worksheets("Sheet1").Activate 

Set LpDoZnalezienia = ws1.Range("A:A").Find("lp.", LookAt:=xlPart) 
Set RazemDoZnalezienia = ws1.Range("A:A").Find("Razem", LookAt:=xlWhole) 

'Petla do szukania pracowników 
For a = 1 To 3 

If (a > 1) Then 
    Set LpDoZnalezienia = ws1.Range("A:A").FindNext(LpDoZnalezienia).Offset(1, 0) 
    Set RazemDoZnalezienia = ws1.Range("A:A").FindNext(RazemDoZnalezienia) 
End If 

'Znalezienie danego pracownika 
Set Pracownik = ws1.Range(LpDoZnalezienia, RazemDoZnalezienia).Resize(, 12) 
Worksheets("Wynik").Activate 

For b = 1 To 35 
'Dana Wartość z arkusza wynik aka nagłówek 
Dim szukanaWartosc As String 
szukanaWartosc = ws2.Cells(1, NaglowekKolumna).Value 

'Znaleziona wartosc w arkuszu Sheet1 
Worksheets("Sheet1").Activate 
Set WartoscDoZnalezienia = Pracownik.Find(szukanaWartosc, LookAt:=xlWhole) 
If WartoscDoZnalezienia Is Nothing Then 
    GoTo Line 
Else 
    Set Znalezione = WartoscDoZnalezienia.Offset(0, 2) 
End If 
Worksheets("Wynik").Activate 
ws2.Cells(NaglowekWiersz + 1, NaglowekKolumna) = Znalezione.Value 

Line: 
'Przesuniecie naglowka o 1 w arkuszu wynik aby szukalo kolejnej wartości 
NaglowekKolumna = NaglowekKolumna + 1 
Next b 
NaglowekKolumna = a 
NaglowekWiersz = NaglowekWiersz + 1 
Next a 

End Sub 

當我嘗試使用FindNext中與早些時候宣佈發現它給我運行時錯誤91對象或變量沒有在這一行設置:

錯誤時的代碼去FindNext中

Error when the code go to findNext

它可以完美地工作,當我將這兩行復制到循環外部時,有人能告訴我什麼即時通訊代碼在我的代碼中做錯了嗎?

+0

錯誤發生時,'a'是什麼?從你的描述中,我猜測它發生在'a = 3'時。在使用之前,你應該檢查'LpDoZnalezienia'是否是'Nothing'。另外,使用'Option Explicit'並聲明所有變量將使你的代碼更健壯。 –

+0

通過imit每個僱主,問題是不是在循環中,因爲當我seting循環做一旦它的工作正常,我有問題,當它來到第二次迭代,因爲它像vba看不到我停用找到外面的循環,所以當它來到FindNext時它會崩潰。 – kstroz

+0

它幾乎不重要你在循環外面聲明的內容,因爲在循環中你用一個新值覆蓋'LpDoZnalezienia'。當FindNext返回Nothing時,錯誤91由'.Offset(1,0)'引起。 – GSerg

回答

1

Find() and FindNext()有點棘手,文檔有點混亂。

用於.FindNext.Find()存儲在ws1.Range("A:A"),而不是在LpDoZnalezienia。簡而言之,您需要保留範圍內正在運行查找的Range的實例。

因此,解決問題的方法是:

With ws1.Range("A:A") 
    Set LpDoZnalezienia = .Find("lp.", LookAt:=xlPart) 
    If Not LpDoZnalezienia Is Nothing Then 
     For a = 1 To 3 
     If (a > 1) Then 
      Set LpDoZnalezienia = .FindNext(LpDoZnalezienia).Offset(1, 0) 
     End If 
    End If 
End With 

With ws1.Range("A:A") 
    Set RazemDoZnalezienia = .Find("Razem", LookAt:=xlWhole) 
    If Not RazemDoZnalezienia Is Nothing Then 
     For a = 1 To 3 
     If (a > 1) Then 
      Set RazemDoZnalezienia = .FindNext(RazemDoZnalezienia) 
     End If 
    End If 
End With 

值得注意的是:如果你只有1或2次出現的「LP」。或「Razem」,你會第二次獲得第一個Range,沒有內部處理來檢查.FindNext()是否已經給你一個特定的Range。你將不得不自己編碼。例如:

With ws.Cells 
    Set fr = .Find("value", , xlValues, xlWhole) 
    If Not fr Is Nothing Then 
     frAddress = fr.Address 
     Do 
      Set fr = .FindNext(After:=fr) 
      'Do something with found range here. 
      Debug.print fr.Address 
     Loop While frAddress <> fr.Address 
    End If 
End With 
+0

值得注意的是,除非您更改找到的值,否則不需要檢查循環中的「不是沒有什麼」。當「FindNext」將循環回搜索範圍的頂部時,「fr」將始終是第一次找到的東西 - 您只需檢查您何時返回到第一個找到的地址('frAddress <> fr。地址') –

+0

好點@ DarrenBartrup-Cook。更新。 –

+0

我有點困惑不要讓範圍的實例聲明它與 Set LpDoZnalezienia = ws1.Range(「A:A」)。FindNext(After:= LpDoZnalezienia).Offset(1,0)? – kstroz