重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

if 文などで「""」を返した場合の空白文字列をブランクにしたい


if 文などで「""」を返した場合は、空の文字列を返しているのであって、ブランクが返ってきているわけではありません。

コピーして貼り付け(値のみ)をしても、空の文字列は空の文字列、ブランクはブランクです。

コピーして貼り付け後(値のみ)の空の文字列をブランクにするには、delete が一番簡単です。

上記の様に記載されているのを見つけました。ここでご質問が御座います




任意の範囲(今回はB1:D50)で空の文字列をブランクに変えるVBAに困っております。

どなたか、教えていただけないでしょうか?

よろしくお願い致します。

使用環境:Windows7x64 Office 2007

A 回答 (7件)

下記を試してみてください。



With Range("B1:D50")
.Value = .Value
End With
    • good
    • 0
この回答へのお礼

ご回答有り難うございます!

処理に掛かる時間が圧倒的に早くなりました!

今回はこれをご利用させて頂きたいと思います。

本当に有り難うございました。

お礼日時:2010/09/20 19:14

>シートAの内容コピーして、シートBに貼り付け際に(値のみ)


>シートBに空白の文字列として貼り付けされるため、

いわゆる「値貼り付け」で、="" というものをコピーし、別の所に貼り付けると、痕跡としては残るけれども、何も入っていないかもしれません。

もしかしたら、マクロは不要かもしれませんが、試しに使ってみてください。(標準モジュールが最適)
以下はループしていませんから、完全に削除されたか確かめるためには、同じプロシージャで、二度マクロを行う必要があります。


Sub DeleteUnVisibleString()
 Dim rng As Range
 Dim c As Variant
 Dim iFlg As Integer
 On Error Resume Next
 Set rng = Range("B1:D50").SpecialCells(xlCellTypeFormulas, xlTextValues)
 iFlg = 0
 If rng Is Nothing Then
  Set rng = Range("B1:D50").SpecialCells(xlCellTypeConstants, xlTextValues)
  iFlg = 1
 End If
 On Error GoTo 0
 Application.ScreenUpdating = False
 If Not rng Is Nothing Then
  For Each c In rng
   If Trim(c.Value) = "" Then
    c.ClearContents
   End If
  Next
  MsgBox rng.Cells.Count & "個の" & IIf(iFlg, "空白値の", "数式の空白値の") & "セルを削除しました。", vbInformation
 Else
  MsgBox "空白値の文字列は見つかりません。", vbExclamation
 End If
 Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

ご回答有り難うございます!

問題なく削除されました。

削除された数もちゃんとでました。

本当に、何度も何度もご教授して頂き有り難うございます!

お礼日時:2010/09/20 19:12

試しに書いてみました。


これで如何でしょうか。


Sub test()
Dim a As Integer
Dim b As Integer

For b = 2 To 4
For a = 1 To 50

If Cells(a, b).Value = "" Then
Cells(a, b).ClearContents

End If

Next a
Next b



End Sub
    • good
    • 0
この回答へのお礼

早速のご返答有り難うございます!

実際に挿入したマクロです。

Dim ma As Integer
Dim mb As Integer
For mb = 2 To 5
For ma = 1 To 100
If Cells(ma, mb).Value = "" Then
Cells(ma, mb).ClearContents
End If
Next ma
Next mb

処理に数秒掛かるのですね!

ウェイト時間に少しビックリしましたが、問題なくクリアされております!

本当に有り難うございました!


PS:もう少し軽い処理があるかもしれないので、ご回答をもう少し受付させて下さい。

お礼日時:2010/09/20 17:08

Range.ClearContentsあたりでしょうか。


対象の各セルに対して""と同値ならClearContents、の繰り返しで良さそうに思えますが。
    • good
    • 0

確かに、空白文字列で返されるのはもどかしいときがありますね。



すでに任意の値が入力されているのかどうかが分かりませんが、入力されている、という前提でお話しします。
多少発想を変えて、以下のようにしてみてはいかがでしょうか。

例)
If Range("B1").value="" then
Range("B1").clear
※clearではなくdeleteかもしれません。

メソッド等に間違いがあるかも知れませんが、簡単に言葉にすると「空白文字列をデリートする」というだけです。

この回答への補足

ご回答有り難うございます。

B1:D50には任意の文字が記入されたセルと
空白文字列のセルが混合しております。

その中から空白文字列のセルを選択し、デリートしたいのです。

ご教授頂いた内容を任意の範囲で実行しましたところ、
実行時エラー13、型が一致しませんと表示されました。

If Range("B1:D50").Value = "" Then
Range("B1:D50").Delete
End If

どの部分がおかしいのでしょうか?ご教授頂けると幸いです。

よろしくお願い致します。

補足日時:2010/09/20 16:56
    • good
    • 0

関数のIF関数を使ってあるセルを空白("")にしてもそのセルには関数が入力されている限り空白にすることはできませんね。

VBAを使って空白にしようとしてもそのセルに関数が入力されている限りは無理で、その関数式を消去しない限り空白にすることはできないですね。
なぜVBAまで使って空白にすることが必要なのでしょう。
例えばCOUNTA関数では関数が入って空白のセルまで数えられてしまいますね。関数を使って文字列の入ったセルの数を求めるのにCOUNTA関数ではなく次のような式にすることで関数で空白となったセルの数を除いた数を求めることができます。参考までに。

=COUNTIF(A1:A100,"?*")

この回答への補足

ご回答有り難うございます。

シートAの内容コピーして、シートBに貼り付け際に(値のみ)

シートBに空白の文字列として貼り付けされるため、

シートBの任意の範囲において空白文字列を選択しDELETE処理を行いたいのです。

説明が言葉足らずで申し訳御座いません。

どうぞお力をお貸し下さい。よろしくお願いします。

補足日時:2010/09/20 16:38
    • good
    • 0

何も入っていないA1セルで


=LEN(A1)は「0」

空白が入っているA2セルで
=LEN(A2)は「1」

やりたいことはこういう判定でしょうか?。

この回答への補足

ご回答有り難うございます。

シートAの内容コピーして、シートBに貼り付け際に(値のみ)

シートBに空白の文字列として貼り付けされるため、

シートBの任意の範囲において空白文字列を選択しDELETE処理を行いたいのです。

説明が言葉足らずで申し訳御座いません。

どうぞお力をお貸し下さい。よろしくお願いします。

※選択したい範囲は空白では無く、空の文字列になります。

補足日時:2010/09/20 16:39
    • good
    • 0

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