4

私はこれをできる限り短くし、それでも十分に説明しようとします:)

フォーラムや VBA 文献を検索しましたが、私が試みていることを実行する方法が見つかりません。

rowTotal >= 60 行のスプレッドシートがあります。行には、各列のセルにテキスト データが含まれているか、パターンと colorindex が設定された空白の行があります。

空白でない行をすべて選択するマクロが必要です。

最初に列 A のセルをループして (列 A のセルにテキスト データがある場合は、その行を選択する必要があります)、activecell.value<> が空かどうかを確認しました。

これがジストです(疑似コードとコードの組み合わせ):

Range("A1").Select
loop to end
  if activeCell.value <> empty then 
    stringVar = stringVar + cstr(activeCell.row) + ":" + cstr(activeCell.row) + ","
  end if 
end loop

stringVar = Left(stringVar, (Len(stringVar) - 1))
Range(stringVar).Select
  1. 行 2 と行 8 にデータがある合計 10 行がある場合、次のstringVarように解決されます"2:2, 8:8"
    Range(stringVar).Selectを書くのと同じ結果になりますRange("2:2, 8:8").Select

  2. 範囲内の行数が <= 45 の場合、これは問題ありません。ただし、データを含む行の数が 45 を超えるとすぐに、コードは失敗しRange(stringVar).Selectます。

マクロレコーダーを試してみましたが、Unionメソッドを使用してこれを回避します。そして、「自分自身、Union() でこれを行うことができます。やったー MacroRecorder」と思いました。しかし、悲しいかな、私の喜びは手抜きでした。
1 つの大きな文字列を 1 つ以上の文字列に分割できると考えていました。これらの小さい文字列はそれぞれ、上記の 45 の制限を下回ります。次に、Union() を使用して、すべての範囲 (これらの小さな文字列) を 1 つの目的の範囲にグループ化できます。

ただし、これらの45> 文字列がいくつあるかがわかった後、コードの実行中に Union() コードをリアルタイムで「ビルド」する必要がありました。

ワークシートを取得して、データを含む行だけを選択する方法は誰でも知っています。これは、45 行を超える数の行が選択されている連続していない行の範囲を持つことになります。

4

3 に答える 3

7

ループは不要 - 使用SpecialCells

列 A のみに使用:

Set rng1 = Columns("A").SpecialCells(xlCellTypeConstants).EntireRow

代わりは。

Sub QuickSet()

  Dim rng1 As Range

  On Error Resume Next
  Set rng1 = Cells.SpecialCells(xlCellTypeConstants).EntireRow
  On Error GoTo 0

  If Not rng1 Is Nothing Then
    MsgBox "Your working range is " & rng1.Address(0, 0)
  Else
    MsgBox "No constants found"
  End If

End Sub
于 2013-01-09T06:32:14.917 に答える
2

まず、オートフィルターを使用することをお勧めします。Excel 2010(およびprob 2007ですが、確認できません)を使用している場合、これはデータを選択し、[データ]タブを選択して、[フィルター]をクリックするだけです。最初の列のドロップダウンボックスを使用して、「空白」の選択を解除します。

まったく同じ機能がExcel2003の[データ/フィルター]メニューオプションにあります。でも、そんなによく覚えていません。実験するか、グーグルで検索する必要があります。

それが機能しない場合:

Sub it()

    Dim cell As Range
    Dim selectRange As Range

    For Each cell In ActiveSheet.Range("A:A")
        If (cell.Value <> "") Then
            If selectRange Is Nothing Then
                Set selectRange = cell
            Else
                Set selectRange = Union(cell, selectRange)
            End If
        End If
    Next cell

    selectRange.Select
    ' selectRange.EntireRow.Select 'If you want to select entire rows

End Sub
于 2013-01-09T04:24:59.417 に答える