2016-06-17 11 views
2

私はエンタープライズシステムでレポートとして生成され、Excelスプレッドシートにダウンロードされたスプレッドシートを持っています。結果のスプレッドシートの空白のセルは、データがなくても実際には空白ではなく、空白のセルには「スペース」文字が含まれていません。 (A1が空白のセルである場合)たとえば、A2の次のセル式がTRUEを返し検索/置換を使用してvbNullStringをクリアする

=IF(A1="","TRUE","FALSE") 

しかし、

=ISBLANK(A1) 

戻りFALSE。

セルにアポストロフィ( ')を入力してセルをコピーすると、この問題を再現できます。次に、[形式を選択して貼り付け...]を使用して別のセルに貼り付けると、貼り付けたセルや数式バーにアポストロフィが表示されません。明確なセルがあるようですが、ISBLANKを使用してFALSEと評価されます。 ソートの結果、偽の空白セルが昇順ソートの最上部に表示され、ソートの最下部にある必要があります。

は、私はすべての列をループするために、偽の空白を修正するために、VBAのループを使用して

IF Cell.VALUE = "" Then 
    Cell.Clear 

を評価することができますが、スプレッドシートは数十のデータの行となど、多くの50として列の何千ものを持っているので、これをプログラムにかなりのオーバーヘッドが加わり、FINDとReplaceを使用することを好むでしょう。ここで

現在は動作しないコードは、次のとおりです。

Range("ZZ1").Copy 
Range("Table1[#All]").Select 
With Selection 
    .Replace What:="", Replacement:=.PasteSpecial(xlPasteValues, xlNone, False, False), _ 
    LookAt:=xlWhole, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 
End With 

次のものがいずれかの偽の空白のセルをクリアするために動作しません:

Replacement:= vbnullstring 
Replacement:= "" 
Replacement:= Cells.Clear 
Replacement:= Cells.ClearContents 
Replacement:= Cells.Value = "" 

私は20の他のものを試してみましたどちらもうまくいかない。

答えて

0

問題は、標準の置換機能ではカバーされていない.PrefixCharacterの隠れた部分を検索していることです。これについての詳細は、https://msdn.microsoft.com/en-us/library/office/ff194949.aspx

.Find関数を使用する必要があります(セルの値ではなく)式を見ることができるため、この関数を使用する必要があります。ここではそれを説明するために、短いサンプルコードは次のとおりです。

Option Explicit 

Public Sub tmpTest() 

Dim cell As Range 
Dim rngTest As Range 
Dim strFirstAddress As String 

Set rngTest = ThisWorkbook.Worksheets(1).Range("A1:G7") 
Set cell = rngTest.Find("", LookIn:=xlFormulas, lookat:=xlPart) 
If Not cell Is Nothing Then 
    strFirstAddress = cell.Address 
    Do 
     cell.Value = vbNullString 
     Set cell = rngTest.FindNext(cell) 
    Loop While strFirstAddress <> cell.Address And Not cell Is Nothing 
End If 

End Sub 
0

私はあなたがそれを動作させるためにReplacementに置くことができる何かを把握することはできません。私はあなたがループしているのを恐れています。すべてのセルをループするのではなく、.Findを使用してオーバーヘッドを減らすことができます。

Sub ClearBlanks() 

    Dim rng As Range 
    Dim rFound As Range 
    Dim sFirstAdd As String 
    Dim rFoundAll As Range 

    Set rng = Sheet1.UsedRange 

    Set rFound = rng.Find(vbNullString, , xlValues, xlWhole) 

    If Not rFound Is Nothing Then 
     sFirstAdd = rFound.Address 
     Do 
      If rFoundAll Is Nothing Then 
       Set rFoundAll = rFound 
      Else 
       Set rFoundAll = Application.Union(rFound, rFoundAll) 
      End If 
      Set rFound = rng.FindNext(rFound) 
     Loop Until rFound.Address = sFirstAdd 
    End If 

    If Not rFoundAll Is Nothing Then 
     rFoundAll.ClearContents 
    End If 

End Sub 
0

あなたは、各列の(一見)空白のセルを選択し、内容をクリアするために、テーブルのフィルタを使用することができます。これは、各ブランクセルを見つけるよりも速くなければなりません。

Sub clearBlankTableEntries() 
    Dim tbl As ListObject, c As Byte 

    Set tbl = ActiveSheet.ListObjects("testTable") 
    For c = 1 To tbl.Range.Columns.Count 
     tbl.Range.AutoFilter Field:=c, Criteria1:="=" 
     Range(tbl.Name & "[Column" & c & "]").ClearContents 
     tbl.Range.AutoFilter Field:=c 
    Next c 
End Sub 
+0

をそのテーブル内の列の一部偽のブランクセルを含んでいない。このコードは、空白を含む列に対してうまく機能します。しかし、列にデータが入っているすべてのセル(空白がない)があれば、列全体が既存のデータから消去されます。 –

+0

それは良くありません!この状況をチェックして、フィルタされたテーブルがヘッダ行以上のものを表示しているときにのみ内容を消去することができます: 'If(tbl.Range.SpecialCells(xlCellTypeVisible).Rows.Count> 1)Then Range(tbl.Name& [Column "&c&"] ")。ClearContents' – lonestorm

2

この

With ActiveSheet.UsedRange 
    .NumberFormat = "General" 
    .Value = .Value 
End With 
+0

これは素早く簡単です。それはすべての数式と書式を削除します。 – lonestorm

+0

フォーマットが重要な場合は、2つの行の範囲に分割し、最初の行を実行し、書式をコピー&ペーストし、2番目の行を実行して書式をコピーして貼り付けることができます。数式を保持するにはすべてのセルをループする必要がありますが、エクスポートされたファイルには数式が含まれていないと仮定します。 – Fredrik

1

バリアント配列は、偽の空に処理する効率的な方法を提供してみてください。私は私の質問には示していませんでした

Sub CullEm() 
Dim lngRow As Long 
Dim lngCol As Long 
Dim X 

X = ActiveSheet.UsedRange.Value2 
For lngRow = 1 To UBound(X, 1) 
    For lngCol = 1 To UBound(X, 2) 
    If Len(X(lngRow, lngCol)) = 0 Then X(lngRow, lngCol) = vbNullString 
    Next 
Next 
ActiveSheet.UsedRange.Value2 = X 

End Sub 
関連する問題