2016-08-02 1378 views
0

我有一個鏈接到外部源的模板。Excel VBA - 粘貼到可見單元格

我的前任創建了它,並且爲了讓眼睛「輕鬆」,他/她通過跳過一行來創建它。即行1,行3,行5,行9,行13等等。

我創建了一個打開工作簿並複製我想要的工作表的vba。

如果我使用下面的代碼,它運行速度非常慢,並且出於某種原因,它不止一次地循環。

for each cell in usedrange 
if cell.hasformula = true and instr(cell.formula, "SUMIF") > 0 then 
     cell.formulaR1C1 = "='\\tel\folder1\folder2\[xlsheet.xlsx]SheetName'!RC 
    end if 
next cell 

因此,我所做的是實際分配一次,複製它,然後粘貼到相應的單元格(如下所示)。

Workbooks(desWB).Sheets(maxSheet + 1).Range("J5").FormulaR1C1 = fullPath 
Workbooks(desWB).Sheets(maxSheet + 1).Range("J5").Copy 
Workbooks(desWB).Sheets(maxSheet + 1).Range("J6:J12,E48:J55,E57:J58,E61:J79,E84:J93,E96:J96,E99:J103").PasteSpecial Paste:=xlPasteFormulas 

後一種方法的工作原理和它的絕對比第一次更快。但是,現在我面臨的情況是,由於模板的設置,某些行具有公式,有些行不具有公式,並且會有數千行。行的跳躍也有時不是2的增量,也可能是3,5等

所以想知道如果有一種方式,是更有效和更高效:

  • 看的使用範圍
  • 如果範圍有公式和公式有「SUMIF」
  • 改變配方到別的
  • 否則跳過檢查下一個單元格
+0

如果一行最左邊的單元格是空白的,那麼這是否意味着應該跳過整個行? –

+0

這是正確的...當這一行是空白時,整行都是空白的。 –

回答

2

如果您只想處理該行中第一個單元格具有非空單元值的行,那麼您應該迭代Range的行列,並在第一個單元格通過測試時跳過行。

您使用For Each cell in range方法的當前代碼仍然會將單元格保持在空行中 - 這是多餘的。

您可以使用下面的代碼跳過空白行,並僅將條件邏輯應用到行,您可以確信某些單元格具有要更新的公式。在這個例子中,我使用Range("C4:E10"),但是您可以根據工作簿結構替換適用於您的Range

Option Explicit 

Sub Test() 
    'could pass in UsedRange of the sheet... 
    IterateRange ThisWorkbook.Worksheets("Sheet1").Range("C4:E10") 
End Sub 

Sub IterateRange(rng As Range) 

    Dim rngCell As Range 
    Dim intX As Integer 
    Dim intY As Integer 

    'iterate all cells in range 
    For intX = 1 To rng.Rows.Count 
     For intY = 1 To rng.Columns.Count 
      'get a cell 
      Set rngCell = rng.Cells(intX, intY) 
      'check if cell is blank or empty 
      If IsEmpty(rngCell.Value) Or rngCell.Value = "" Then 
       'skip the rest of the columns in this row and goto next row 
       Exit For 
      Else 
       'this row has non-empty cells - do something 
       Debug.Print rngCell.Address 
       'some other test 
       If rngCell.HasFormula And InStr(1, rngCell.Formula, "SUMIF") Then 
        'update formula... 
        Debug.Print rngCell.Formula 
       End If 
      End If 
     Next intY 
    Next intX 

End Sub 
+0

感謝您的幫助Robin ...我還沒有測試過,因爲我試圖把'IterateRange'合併到我現有的子文件中。 爲'Debug.Print rngCell.Formula',有沒有一種方法來合併到我現有的子?這是正確的嗎?工作簿(desWB).Sheets(maxSheet + 2).rngCell.FormulaR1C1 = fullPathConsol fullpathConsol是從我現有的Sub? –

+0

我把'Debug.Print rngCell.Formula'作爲佔位符。你可以用你的邏輯來替換它來更新單元格'FormulaR1C1'屬性。我認爲在你的原始問題中有一個錯字(沒有關閉雙引號),所以我把它當作是你需要做的事情:)基本上,一旦你知道你想對那個單元格做些什麼 - 你可以替換掉'Debug.Print'聲明。 –

+0

謝謝羅賓!將研究它並代表你。如果這是我正在尋找的答案,我會在它上面打勾。 –