2016-10-06 38 views
0

你好計算器社區,MS Excel的VBA - 環通的行和列(跳過如果爲null)

我必須承認,我的MS Access內主要的代碼,並有MS Excel的VBA的經驗非常有限。

我目前的目標是這樣的,我有一個費用報告發送給我在另一個國家的貨幣扣除,本報告有許多不同的帳戶名稱列可能填充或可能爲空。

我目前有一個宏將打開一個輸入框並要求HostCurrency/USD匯率,我的下一步將從第一條記錄開始(第14行; AK列包含有關扣除的個人信息)然後跳到第一個扣除科目(扣除科目開始於列L並跨越列DG),檢查每個單元格是否爲空,如果它繼續向右移動,如果它包含一個值,那麼我想用該FX乘以該值在輸入框中輸入的速率變量,並用收斂來更新單元格。一旦最後一列(DG)執行完畢,我想移動到下一行(第15行),並一直重新開始這個過程,直到我的「使用範圍」中的「LastRow」。

我非常感謝任何反饋,解釋或鏈接,可能會指向我的目標。預先感謝您花時間閱讀這篇文章!

回答

0

這將做到沒有循環。

Sub fooooo() 
Dim rng As Range 
Dim mlt As Double 
Dim lstRow As Long 
mlt = InputBox("Rate") 

With ActiveSheet 
    lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
    Set rng = .Range(.Cells(14, 12), Cells(lstRow, 111)) 
    rng.Value = .Evaluate("IF(" & rng.Address & " <>""""," & rng.Address & "*" & mlt & ","""")") 
End With 
End Sub 

如果你的表是靜態的,你可以用WorkSheets("YourSheetName")取代ActiveSheet。將"YourSheetName"更改爲表格的名稱。

+0

非常感謝,完美的作品! – Ace16150s

+0

@ scott16150s如果你有大量的行,你會發現這個比迭代每個單元更快。 –

+0

@ scott16150s我注意到你試圖標記爲正確。將最終使用的那個標記爲正確。我提高了另一個,因爲這是一個很好的答案。您需要決定哪種方式最適合您的需求。 –

1

首先,您應該嘗試自己編寫代碼併發布您的代碼,以便有人可以嘗試將您指向正確的方向。如果你的範圍將是靜態的,這是一個非常簡單的問題。您可以嘗試的東西沿着線:

Sub calcRate(rate As Double, lastrow As Integer) 
    Dim rng As Range 
    Set rng = Range("L14" & ":DG" & lastrow) 

    Dim c As Variant 
    For Each c In rng 
     If c.Value <> "" Then 
      c.Value = c.Value * rate 
     End If 
    Next 

End Sub 

該代碼將通過每個單元在給定的範圍和步驟,而不需要多次循環應用的代碼。現在您可以在輸入ratelastrow的表單中調用calcRate子。

+0

我會讓拉斯特羅長一段時間,但我懷疑OP會有超過32000行。 –