2012-02-24 1 views
1

0が見つかったときに行と列の内容をクリアしようとしています。固定列と変化する行を両方に変化させる方法

私はそれらをクリアするためのコードを書くことができますが、私は行を変えることしかできません。それだけ、私のコラムは固定されており、私は列Z.

私のコードを検討するために類似したコードのよりを追加した後、それは少し長い取得するために開始し

Sub Macro1() 

Dim columnval As Long, k As Long 

For k = 5 To 6 

    If (Range("A" & k)) = 0 Then 
    Range("A" & k).ClearContents 
    End If 

Next k 

For k = 5 To 6 

    If (Range("B" & k)) = 0 Then 
    Range("B" & k).ClearContents 
    End If 

Next k 

End Sub 

を次のようにあるコードが働いています列Zに来ると時間がかかりすぎます。もしあなたがより良い方法を持っているなら、それを私と共有してください!ありがとう!

+0

あなたがあなたの目標を達成するために、非効率的な方法で、列と行をループ値を探しています。以下のコードサンプルを更新しました。詳細はこちら(http://siddharthrout.wordpress.com/2011/07/14/find-and-findnext-in-excel-vba/) –

答えて

1

最短、あなたが望むものを達成するために最速方法です。

Option Explicit 

Sub Sample() 
    Sheets("Sheet1").Cells.Replace What:="0", Replacement:="", _ 
    LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _ 
    SearchFormat:=False, ReplaceFormat:=False 
End Sub 

FOLLOW UP

私は唯一の列A-Z、行5と6でコンテンツをオーバークリアしたい場合何こんにちは、?それはすべてをクリアしているようだ。 - user1204868 14分前

Option Explicit 

Sub Sample() 
    Dim Rng As Range 

    Set Rng = Sheets("Sheet1").Range("A5:" & "Z" & Rows.Count) 

    Rng.Replace What:="0", Replacement:="", _ 
    LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _ 
    SearchFormat:=False, ReplaceFormat:=False 
End Sub 

シド

+0

こんにちはsid、もう一度お返事いただきありがとうございます! :)私はあなたのことを試しましたが、それは何とか行5の下のすべての行を削除します。私はジェリーの答えを使用します! :) – user1204868

+0

はい、これを伝えているので...どの行を削除したいですか?行5と6だけを消去したい場合は、{"Z"&Rows.Count}を "Z6";に置き換えてください) –

+0

OH!それはあまりにも別の方法です!ありがとう! :) – user1204868

0
option explicit 

sub conditional_clear() 
    dim r as long 
    dim c as long 
    dim ws as worksheet 

    for each ws in worksheets 
     for r = 1 to ws.usedrange.rows.count 
      for c = 1 to ws.usedrange.columns.count 
       with ws.cells(r,c) 
        if .value = 0 then 
         .clearcontents 
        end if 
       end with 
      next c 
     next r 
    next ws 
end sub 

編集:
あなたはあなたの明確なセルの内容エリアをより細かく制御したい場合は、この

sub conditional_clear(srow as long, erow as long, scol as long, ecol as long) 
    ... 
     for r = srow to erow 
      for c = scol to ecol 
    ... 

のようなものに変更し、この

call conditional_clear(5, 6, 1, 26) 
+0

こんにちは、あなたのコードにエラーがあるようですat .clearcontents() – user1204868

+0

こんにちは、それはテストでした。合格。 – bernie

1

のようにそれを呼び出しますこのアプローチでは、使用した行と列だけで評価されるセルの数が減少します。

Option Explicit 

Sub ClearZeroValuesInUsedRange() 
Dim LR As Long, LC As Long, r As Long, c As Long 

LR = Cells.Find("*", Cells(Rows.Count, Columns.Count), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
LC = Cells.Find("*", Cells(Rows.Count, Columns.Count), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

Application.ScreenUpdating = False 

    For r = 1 To LR 
     For c = 1 To LC 
      If Cells(r, c) = 0 Then Cells(r, c).ClearContents 
     Next c 
    Next r 

Application.ScreenUpdating = True 
End Sub 

そして、あなたはいくつかの大きな数値にを増やすことで、左の一番上または列の一部の行をスキップしたい場合は、開始番号を変更することができますかなり高速である必要があります。

この例では、行のためにある唯一の5 & 6 A-Z:

ここ
Sub ClearZeroValuesInUsedRange() 
Dim r As Long, c As Long 

Application.ScreenUpdating = False 

    For r = 5 To 6 
     For c = 1 To 26 
      If Cells(r, c) = 0 Then Cells(r, c).ClearContents 
     Next c 
    Next r 

Application.ScreenUpdating = True 
End Sub 
+0

こんにちは、私は5行目と6列目、A-Z列目のコンテンツを消去したいだけですか?それはすべてをクリアしているようだ。 – user1204868

+0

はい、私はそれらの行/列だけを上の2番目のバージョンを追加しました。 –

+0

こんにちは、ありがとう!:) – user1204868

関連する問題