2016-08-02 8 views
0

私は外部ソースにリンクしているテンプレートを持っています。Excel VBA - 可視セルに貼り付け

私の前任者はそれを作成し、目の上の「容易さ」のために、彼は行をスキップして作成しました。すなわち行1、次に行3、行5、行9、行13などがありますが、これらの行の間にはDEFAULT EMPTY CELLしかありません。

ブックを開き、必要なシートをコピーするvbaを作成しました。

以下のコードを使用すると、実行速度が非常に遅くなり何らかの理由で2回以上ループします。

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 

したがって、私が実際に行ったことは、それを1回割り当ててコピーし、それぞれのセルに貼り付けることです(下図参照)。

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など

に、より効果的かつ効率的だ方法があるのであれば疑問に思って:使用範囲で

  • ルック
  • 範囲は、式があり、式が他の何かエルス
  • SKIPとチェック次のセルに数式を持っている「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)。シート(maxSheet + 2).rngCell.FormulaR1C1 = fullPathConsol fullpathConsolは私の既存のサブですか? –

+0

私は 'Debug.Print rngCell.Formula'をプレースホルダとして配置しました。セルの 'FormulaR1C1'プロパティを更新するロジックに置き換えることができます。私はあなたの元の質問(閉じない二重引用符)のタイプミスがあると思うので、私はこれをあなたのために何かすることを残しました:)基本的にあなたはそのセルで何かをしたいと知っていれば - あなたは 'Debug.Print'ステートメント。 –

+0

ありがとうRobin!それを見てあなたに回想します。それが私が探している答えなら、私はそれにチェックマークをつけるでしょう。 –

関連する問題