2017-03-28 66 views
-1

我試圖寫一個宏,將
1)存儲在一個代碼可變searchstring
件A列中的每個小區的值,該值我想這是否是填充每個細胞與式

lr = Cells(Rows.Count, 2).End(xlUp).Row 
    For i = 2 To lr 
     searchstring = ws.Cells(i, 1).Value 

2)取變量searchstring並確定它是否存在於名爲rsca的工作表的A列中。
4)如果它以是
5)更新N列。如果它不與任何

更新N列這是我的完整的語法,但每次我通過我的代碼步驟它擊中了對於線立即跳轉到End Function我的工作表中有數據,列A大約有40行要精確(但是這可能會波動上下,所以我不想硬編碼一個結束單元格)

該句法應如何更改它會在上面達到我想要的結果?

Public Function CheckIfCurrent() 
    Dim ws As Worksheet, searchstring As String, i As Long 
    Set ws = Sheets("ers") 

    lr = Cells(Rows.Count, 2).End(xlUp).Row 
    For i = 2 To lr 
     searchstring = ws.Cells(i, 1).Value 
     With .Range("N2:N" & .Cells(.Rows.Count, "A").End(xlUp).Row) 
     .Formula = IIf(IsError(Application.Match(searchstring, Sheets("rsca").Columns(1), 0)), "No", "Yes") 
     .Value = .Value 
     End With 
    Next i   
End Function 
+0

你'lr'不是完全限定的,其修改爲'LR = ws.Cells(ws.Rows.Count,2).END(xlUp).Row ',或者在之前添加'With ws'並且在 –

+0

和'ws.Rows.Count'之前添加'.',工作表'With .Range(「N2:N」&.Cells(.Rows.Count,「A」) .End(xlUp).Row)'屬於? –

+0

我修改了你的lr行,並得到了相同的結果。行數應該屬於表格(「ers」) – BellHopByDayAmetuerCoderByNigh

回答

-1

這個怎麼樣?

Public Sub CheckIfCurrent() 
    Dim searchstring As String 
    Dim i As Long 

    With ThisWorkbook.Worksheets("ers") 
     lr = .Cells(.Rows.Count, 1).End(xlUp).Row 
     For i = 2 To lr 
      searchstring = .Cells(i, 1).Value 
      With .Range("N2:N" & lr) 
       .Formula = IIf(IsError(Application.Match(searchstring, Sheets("rsca").Columns(1), 0)), "No", "Yes") 
       .Value = .Value 
      End With 
     Next i 
    End With 
End Sub 
+0

同樣的結果。它擊中了行並立即停止。沒有進一步處理。 – BellHopByDayAmetuerCoderByNigh

+0

@BellHopByDayAmetuerCoderByNigh,B列是什麼? – CallumDA

+0

ers上的B列爲空白,rsca上的列B有十進制值 – BellHopByDayAmetuerCoderByNigh

2

這是我的要求的理解:

套用公式,以表ersN列中,驗證如果同一行A列中的值出現在工作表rscaA列。 如果找到該值,則公式將返回Yes,否則返回No

由於目標是使用Excel公式返回期望的結果,因此不需要循環任何涉及的範圍。

此解決方案適用於Target Range以下公式:

=IF(ISERROR(MATCH(RC1, #rSrc, 0)), ""No"", ""Yes"")

其中:

Target Range位於片ersN2:Nrr在最後一行與A列數據)

#rSrc表示位於片rscaA2:ArSource Range的地址(r在最後一行與A列數據)

以下代碼:

  • 採用恆定保持Excel公式。
  • 獲取每個工作表中數據的最後一行。
  • 構建目標和源範圍。
  • source range address更新excel公式。
  • 並將excel公式應用於目標範圍,並留下結果值。

試試這個代碼:

Public Sub CheckIfCurrent_Published() 
Const kFml As String = "=IF(ISERROR(MATCH(RC1, #rSrc, 0)), ""No"", ""Yes"")" 
Dim rTrg As Range, rSrc As Range 
Dim sFml As String 

    Rem Set Target Range (Sheet `ers`) 
    With ThisWorkbook.Worksheets("ers") 
     Set rTrg = .Range("N2:N" & .Cells(.Rows.Count, 1).End(xlUp).Row) 
    End With 

    Rem Set Target Range (Sheet `rsca`) 
    With ThisWorkbook.Worksheets("rsca") 
     Set rSrc = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row) 
    End With 

    Rem Reset Formula 
    sFml = kFml 
    sFml = Replace(sFml, "#rSrc", rSrc.Address(ReferenceStyle:=xlR1C1, External:=1)) 

    Rem Apply Formula 
    With rTrg 
     .FormulaR1C1 = sFml 
     .Value = .Value2 
    End With 

    End Sub 
+0

Rem代碼行/是什麼意思? – BellHopByDayAmetuerCoderByNigh

+1

請參閱[Rem聲明](https://msdn.microsoft.com/en-us/library/office/gg278825(v = office.15).aspx)或者只需在VBA編輯器中選擇該單詞並按[F1] – EEM

+0

這真的應該是被接受的答案。 – user2676140