2

別のワークシートの空のセルを参照する行を非表示にする VBA スクリプトを作成しました。つまり、シート 1 には空のセル A1 が含まれています。シート 2 のセル A1 には "Sheet1!A1" が含まれていますが、0 が出力されます。スクリプトはすべての行を調べて、空の参照を含む行を非表示にすることになっていますが、そうしていないようです。あなたが私の間違いを理解するのを手伝ってくれるなら、それは素晴らしいことです. これまでの私のコードは次のとおりです。

Sub Hide()
Application.ScreenUpdating = False
Dim i As Integer
For i = 1 To 1000
If IsEmpty(Cells(1, i)) Then
Rows(i).EntireRow.Hidden = True
End If
Next i
Range("A1").Select
Application.ScreenUpdating = True
End Sub

どんな種類の助けにもとても感謝しています。

よろしくお願いします、

アレックス

4

2 に答える 2

1

ここでのアレックスは、これを行うための少し複雑な方法です。しかし、それは機能します:)

: これは、同じブック内のシートまたは開いているブックのシートを参照する数式に対してのみ機能します。

ロジック:

  1. このコードは、数式を持つセルを識別し、それらをループします
  2. 次に、数式を持つすべてのセルをループしながら、.Precedentsそのセルの をチェックします。ここが最もトリッキーな部分です。.Dependentsまたは.Precedentsを別のワークシートまたはワークブックに配置する簡単な方法はありません。この性質の限界と言っていいでしょう。だから私はそれらを得るために代替手段を使用しています:)
  3. そのセルのアドレスを取得したら、それらが空かどうかを確認し、条件に基づいてセルを非表示にしています。

コード

Sub Sample()
    Dim ws As Worksheet
    Dim rng As Range, acell As Range, bcell As Range

    '~~> This is the sheet which has the formula
    Set ws = Sheets("Sheet1")

    With ws
        '~~> Get the address of all the cells which have formulas
        Set rng = .Cells.SpecialCells(xlCellTypeFormulas)

        '~~> Loop through the cells
        For Each acell In rng
            If acell.EntireRow.Hidden = False Then
                If acell.Value = 0 Then
                    On Error Resume Next
                        '~~> Clear any precedents/dependent arrows if any
                        .ClearArrows
                        '~~> Show precedents
                        acell.ShowPrecedents
                        '~~> Navigate to the relevant cell in the other worksheet
                        acell.NavigateArrow True, 1
                        '~~> Compare address and name to check if they are not from ws
                        If ActiveCell.Address <> rng.Address Or ActiveCell.Worksheet.Name <> .Name Then
                            Set bcell = Sheets(ActiveCell.Worksheet.Name).Range(ActiveCell.Address)
                            '~~> Check if it not empty
                            If Len(Trim(bcell.Value)) = 0 Then
                                '~~> If empty, hide the row
                                .Rows(acell.Row).EntireRow.Hidden = True
                            End If
                        End If
                        '~~> Clear any precedents/dependent arrows if any
                        .ClearArrows
                        .Activate
                    On Error GoTo 0
                End If
            End If
        Next
    End With
End Sub

スナップショット

マクロ実行前のシート 1

ここに画像の説明を入力

シート2はこんな感じ

ここに画像の説明を入力

そして、これはSheet1がマクロの後にどのように見えるかです

ここに画像の説明を入力

于 2012-08-05T23:04:38.187 に答える
0

ループで使用Cells(1, i)するということは、列 A の行を下るのではなく、行 1 の列に沿って作業していることを意味しますCells(i, 1)

Cellsandの呼び出しRowsは修飾されていないため、アクティブなシートを参照します。あなたの説明から、両方が同じシートを参照する必要があるかどうかは 100% 明確ではありません。たとえば、 をSheet2!A1参照する式が含まれているため、 を空にすることはできませんSheet1!A1

したがって、 で空のセルをチェックしたいSheet1が、実際には で行を非表示にしたい場合がありますSheet2Worksheets("Sheet1").Cells(i, 1)これにより、およびへの呼び出しが変更されます。Worksheets("Sheet2").Rows(i)

物事がより複雑で、空のチェックと行の非表示の両方が必要な場合はSheet2、列 A の値がゼロのすべての行を非表示にする必要があります (これは、列 A の行のいずれかにSheet1実際にゼロが含まれている場合に問題になる可能性があります)。値) または数式を変更して、 のSheet2空のセルを明示的に処理しますSheet1

たとえば、式は次のSheet2!A1ようになります。=IF(ISBLANK(Sheet1!A1),#N/A,Sheet1!A1)

マクロのチェックは次のようになります。

If IsError(Cells(i, 1).Value) Then
  If (Cells(i, 1).Value = CVErr(xlErrNA)) Then
    Rows(i).EntireRow.Hidden = True
  End If
End If

チェックをそのまま使用することもできますがIsError、ソース データの真のエラー (ゼロによる除算など) を隠す可能性があります。

于 2012-08-05T23:02:49.447 に答える