2017-03-02 1 views
0

親愛なるスーパーマ!列と印刷の値の空のセルをVBAで確認してください

列Jには、チェックされた値などの空の行と行があります。

空のセルがある場合は「未チェック」を出力するvbaコードを書き込もうとしましたが、これは動作しますが、値がチェックされているセルにヒットした場合は停止します。おそらく、完全には満たされていないにもかかわらず何も印刷しないが、それでもまだその数式が含まれているセルに数式があるため、次のセルに移動することはありません。私の場合は、J7まで空のセルがあり、その後J15で再び開始されます。これはソースデータに関して時々変更される可能性があります。

私がこれを好きな理由は、beacuseです。すでにいくつかの値を印刷している列Jの式と、異なる列の他の値をチェックし、列Jに印刷するVBAコードがあります。フィルタのマスター列の並べ替え。だから、これは私がそれを行う必要がある方法です。セルは、この場合、式ウィッヒが含まれている場合

私のコード右今、

Sub DoIfNotEmpty() 
    Dim ra As Range, re As Range 

    With ThisWorkbook.Worksheets("Sheet1") 
     Set ra = .Range("J:j25") 
     For Each re In ra 
      If IsEmpty(re.Value) Then 
       re.Value = "unchecked" 
      End If 
     Next re 
    End With 
End Sub 

iは、空のセルに印刷することができ満たされていないif文を持っていますか?

+0

'.Range(" J:j25 ")'を '.Range(" J1:j25 ")'で変更する必要がありますが、この問題を除いてあなたのコードを試しました。 25行目の問題の後ではないと確信していますか? –

+0

Ahhaaa私は問題が何であるかを考え出したと思う。私はセルの数式を持っているので、私はそれらの細胞に価値があると信じています。いくつかの点では、それらのセルの値が削除されているためです。この問題を回避する方法がある場合は、今すぐに行ってください。 – DL1

+0

@DanneL私の答えを参照 –

答えて

2

を書くことができポイントはそれが.Range("J1:j25")であるはずです。私は細胞が空に見えますが、それはそうではないと思います。

空の文字列を含むセル""はもう空ではありませんが、そのように見えます。あなたはこのようにそれをテストすることができます。

  1. を新しいワークシートの書き込みではA1に:=""は(間にスペースがない!)
  2. コピーA1とA1で特殊なペースト値を。 A1は空に見えます。
  3. VBAでDebug.Print IsEmpty(Range("A1").Value)を実行すると、FALSEとなります。

セルA1に空の文字列が含まれているため、セルA1はもう空ではありません。

あなたは何ができますか?

Sub DoIfNotEmpty() 
    Dim ra As Range, re As Range 

    With ThisWorkbook.Worksheets("Sheet1") 
    Set ra = .Range("J1:J25") 
     For Each re In ra 
      If IsEmpty(re.Value) or re.Value = vbNullString Then 
       re.Value = "unchecked" 
      End If 
     Next re 
    End With 
End Sub 

これは疑似空のセルも「未チェック」とマークします。しかし、空文字列""という結果になる数式も削除されることに注意してください。

+0

それは上司のように働いた!ありがとう!! – DL1

+1

ちょっとポイント '" "= vbNullString'です。これは、VBAコンパイラが各' "" 'の変数を作成するのを避け、パフォーマンスを向上させます! ;)@DanneL – R3uK

+1

興味深いことに、セルの値を '' "'に設定すると、 '' Cells(1,1).Value = "a"のようにセルが空になります:Debug.Print IsEmpty(Cells(1,1) ):セル(1,1).Value = "":Debug.Print IsEmpty(Cells(1,1)) ') – YowE3K

2

あなたは空白を返す数式を持っている場合、Rangeオブジェクト

Sub DoIfNotEmpty()  
    ThisWorkbook.Worksheets("Sheet1").Range("J1:J25").SpecialCells(xlCellTypeBlanks).Value = "unchecked" 
End Sub 

か、のSpecialcells()方法を悪用し、その後AutoFilter()「ブランク」細胞と@Maximeポルトのから除き、それらに

Sub DoIfNotEmpty() 
    With ThisWorkbook.Worksheets("Sheeet1").Range("J1:J25") '<--| reference your range (first row must be a "header") 
     .AutoFilter Field:=1, Criteria1:="" '<--| filter its empty cells 
     If Application.WorksheetFunction.Subtotal(103, .cells) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Value = "unchecked" '<--| if any cell filtered other than headers then write "unchecked" in them 
     .Parent.AutoFilterMode = False 
    End With 
End Sub 
+0

場合によっては、for/eachループをautofilterを使うよりも速くすることができます。私はかなり前にかなり大きなExcelシートで試してみましたが、それ以降はオートフィルタよりもはるかに高速で、その後はオートフィルタをオフにしました。 'Range(" J1:J25 ")'ではなく大きなデータテーブルで問題が発生する可能性があります。 –

+0

@ Peh、実際には、 'For Each Cell In Range'ループが' Autofilter() 'よりも速いという話は初めてですが、私の経験ではこれはずっと反対です。 – user3598756

+0

私はしません私が言ったことを証明するための最小の例があります。そして、場合によってはオートフィルタが実際に高速ですが、私はExcelのシートを計算中に32ビットExcelの限界に達するようにしました(RAMの使用のために)。私たちはいくつかの計算時間分析を行いました。主観的感情)、フィルタを3回使用しないことで計算時間を改善することができます。 –

関連する問題