2016-08-02 223 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

谢谢罗宾!将研究它并代表你。如果这是我正在寻找的答案,我会在它上面打勾。 –

相关问题