2

8 列のデータ AH を含むスプレッドシートがあります。それぞれの長さが異なり、削除する必要がある "0" の値が含まれている可能性があります。ループでこれを行うのではなく、.Find メソッドを使用してこれを実行しようとしていますが、find メソッドが空のセル (列が最大長の列よりも短い) をゼロとして分類し続けるため、行き詰まります。関数がこれらのセルの 1 つを見つけると、特定のセルを選択するのではなく、その列の上部にあるセルを選択して削除します。0 以外の値を使用してコードを使用しようとしましたが、正常に動作するため、空のセルを "0" として分類する Excel に問題があります。

値「0」を具体的に検索する方法はありますか? str(0) を使用して文字列値「0」を指定しようとしましたが、同じ結果が得られました。私のコードのサブセットは次のとおりです。

Row = wf.Max(Cells(Rows.Count,1).End(xlUp).Row, Cells(Rows.Count,8).End(xlUp_.Row

'Originally I had zero = 0 or "0" but I tried the following to get a string version
zero = Str(0)
zerofix = Right(zero,1)

Do While Check_Val_Existence(zerofix,Row) = True
   Set aCell = ActiveSheet.Range(Cells(1,1), Cells(Row,8)).Find(What:=zerofix,LookIn:=xlValues)
   If Not aCell Is Nothing Then
      aCell.Delete Shift:=xlUp
   End If
Loop

どこ

Function Check_Val_Existence(ByVal Srch, ByVal Row) As Boolean

Dim rFnd As Range

Set rFnd = ActiveSheet.Range(Cells(1,1), Cells(Row,8)).Find(What:=Srch)
If Not rFnd Is Nothing Then
   Check_Val_Existence = True
Else
   Check_Val_Existence = False
End If

End Function

コードをループして各列を順番に検索する必要はありませんが、それを行う必要があるように見え始めています。

4

3 に答える 3

2

これを試して

Sheet1.Cells.Replace What:="0", Replacement:="", LookAt:=xlwhole, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False  

これにより、「0」を持つすべてのセルがクリアされます

「0」のセルを削除したい場合は、.Findとも使用できます.FindNext。このリンクを参照してください

トピック: Excel VBA の .Find と .FindNext

リンク: http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

そのリンクから引用

このチュートリアルでは、.Find を使用して検索を高速化する方法を強調します。

.Find の構文は次のとおりです。

expression.Find(What、After、LookIn、LookAt、SearchOrder、SearchDirection、MatchCase、MatchByte、SearchFormat)

どこ

式 (必須): 任意の有効な範囲オブジェクトです。したがって、上記の例を使用すると、範囲は Range(“A1:A” & lastRow) になります。

What (Optional Variant): 「検索値」とは</p>

After (Optional Variant): 検索を開始するセル。

LookIn (Optional Variant): 情報のタイプ。(xlValues または xlFormulas)

LookAt (オプションのバリアント): 次の XlLookAt (定数) のいずれかにすることができます: xlWhole または xlPart。

SearchOrder (オプションのバリアント): 次の XlSearchOrder 定数のいずれかにすることができます: xlByRows または xlByColumns。

SearchDirection: これらの XlSearchDirection 定数のいずれかになります。xlNext デフォルト xlPrevious

MatchCase (オプションのバリアント): True を指定すると、検索で大文字と小文字が区別されます。デフォルト値は False です。

MatchByte (オプションのバリアント): 2 バイト言語サポートを選択またはインストールした場合にのみ使用されます。2 バイト文字を 2 バイト文字のみに一致させる場合は True。2 バイト文字を 1 バイト文字と一致させる場合は False。

SearchFormat (オプションのバリアント): 検索形式。

于 2012-08-08T07:51:59.297 に答える
0

すべてのセルを操作するのではなく、予備作業を行って対象範囲を定義します。つまり、定数または数式として入力された数値を持つセルです。これにより、空白のセルが検索から除外され、コードが高速化され、偽フラグが排除されます。

この例rng3では、 上の対象のセルを返しますActiveSheetFind次に、この範囲でルーチンを実行します

Sub LookAtZeros()
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
On Error Resume Next
Set rng1 = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
Set rng2 = Cells.SpecialCells(xlCellTypeFormulas, xlNumbers)
On Error GoTo 0
If Not rng1 Is Nothing Then
If Not rng2 Is Nothing Then
Set rng3 = Union(rng1, rng2)
Else
Set rng3 = rng1
End If
Else
If Not rng2 Is Nothing Then Set rng3 = rng2
End If
If Not rng3 Is Nothing Then
MsgBox "Range with numeric constants and/or numeric formulae is " & rng3.Address(0, 0)
Else
MsgBox "no numbers", vbCritical
End If
End Sub
于 2012-08-08T07:57:36.797 に答える
0

私の提案は、0 から =0/0 への一般的な置換を行うことです。これにより、エラーが発生するはずです (また、独自の計算により、必要に応じて値を 0 に戻す方法も提供されます)。次に、find/ を実行します。特別なエラーを選択します。

于 2012-08-09T17:13:19.530 に答える