プロが教えるわが家の防犯対策術!

お世話になっております。
Excelvba2013で、数式を含むセル範囲を、VBAのコードで
ws1.Range(ws.Cells(6, copydate_colsta), ws.Cells(6, copydate_colend)).Copy
ws2.Range("C7").Offset(0, paste_col).PasteSpecial xlPasteValues '値貼り付け

のように、コピーして値貼り付けしました。
その後、
For j = 1 To plan_row
Set c = daily_ws.Range(Cells(j + 7, 3).Offset(0, paste_col), Cells(j + 7, plan_col + 2).Offset(0, paste_col))
daily_ws.Range(Cells(j + 7, 3).Offset(0, paste_col), Cells(j + 7, plan_col + 2).Offset(0, paste_col)).Select
If WorksheetFunction.CountA(c) = 0 Then
Debug.Print c.Address
MsgBox "空白です。"
Else
MsgBox "空白ではありません。"
End If
Next j
のように、範囲内全てが空白かどうか1行毎にチェックしていったのですが、値貼り付けしたにも関わらず、数式が入っていたセルをカウントしてしまい、空白をうまく取得できません。
数式の結果は、空白なので、それをコピーして値で貼り付けても見た目は空白です。
ジャンプ機能で空白セルを確認すると、やはり数式をコピーして値貼り付けしたセルは空白になっていないようです。
何も見えないセルを選択してDeleteすると、空白になるようですが、空白セルが取得できず困っています。
何か対処法はあるのでしょうか?それとも、どこか書き方に問題があるのでしょうか?
宜しくお願いします。

A 回答 (2件)

こんばんは!



1セルだけであれば、単純に
>If c = "" Then
だけで良いと思いますが、複数セルを参照する場合のやり方として

① 変数を追加し
 For Each r In c
  If r <> "" Then
   cnt = cnt + 1
  End If
 Next r
  If cnt = 0 Then
   MsgBox "空白"
  Else
   MsgBox "空白ではない"
  End If
のように範囲内をループさせる方法

② 通常のワークシート関数でも数式が入っていて「空白」に見えるセルは
COUNTA関数では「空白ではない」と判断されてしまいますので、別の関数(COUNTIF関数)を使います。

If WorksheetFunction.CountIf(c, "?*") = 0 Then

のように「文字長」が1以上のセル数をカウントする!
というやり方

※ 簡単なのは②の方法だと思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。№1さんに教えていただいた、
c.Value = c.Value
を追加したら、消えました。
①のやり方は、2度判定みたいな感じになってしまいますね。アイデアですね。
②のやり方でも、問題ないのを確認できました。

どうもありがとうございました。

お礼日時:2019/03/10 20:49

最初に関係のないことかもしれませんが、コードが読みにくいです。


変数に、_ (アンダースコア)は使わないことと決めているルールもあるぐらいです。
しばらく経ったら、読めなくなっていると思います。

値貼り付けした後、長さ0の文字列の消し方は、以下のように .Value =.Value というテクニックを使います。

Dim pRow As Long
Dim dWh As Worksheet
Set dWh = Worksheets("Sheet2")
Dim p As Long, q As Long '短いほうが読みやすい

 'ws1.Range(ws.Cells(6, copydate_colsta), ws.Cells(6, copydate_colend)).Copy
  'ws2.Range("C7").Offset(0, p).PasteSpecial xlPasteValues '値貼り付け

 With dWh
  pRow = .Cells(Rows.Count, 1).End(xlUp).Row
  For j = 1 To pRow
   With .Range(.Cells(j + 7, 3).Offset(0, p), .Cells(j + 7, q + 2).Offset(0, p))
    'RangeオブジェクトとCellsプロパティとは関連性がないので、両方ともシートを指定しないと、エラーがでる可能性がでます。
    .Value = .Value 'これで空白が消えるはずです。

    If WorksheetFunction.CountA(.Cells) = 0 Then 'With ステートメントで、範囲は.Cells で表せます。
     MsgBox "空白です。"
    Else
     MsgBox "空白ではありません。"
    End If
   End With
  Next j
 End With
    • good
    • 0
この回答へのお礼

読みにくいコードを解読して、ご回答どうもありがとうございました。

.Value = .Value 'これで空白が消えるはずです。
上記のコードでも、今のコードに追加してもうまくいきました。
どうしてこれで消えるのかよく分からないですが、経験と知識がないと分からないですね。
とても助かりました。
どうもありがとうございました。

お礼日時:2019/03/10 20:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A