5

スプレッドシートに列 (A) と列 (B) の 2 つの列があります。

列 (A) にはクエリから抽出された名前 (例: Brian、Bob、Bill など) が含まれ、列 (B) には 3 つのステータス (Assigned、In Progress、または Pending) のいずれかが含まれます。

ただし、このクエリは、名前のないステータスに対して「割り当て済み」を示す一部の項目を取得する場合があるため、列 (A) の名前を表す対応するセルは空白です。そのため、これらの空のセルに「不明」を手動で入力します。

私がやりたいことは、列 (​​A) のすべての空のセルを検索し、右側のセルに「割り当て済み」という単語が含まれている場合に「不明」という単語を入力するマクロを作成することです。

したがって、条件は次のとおりです。

  1. 列 (A) の空白セル

  2. その右側の対応するセル (列 B) には、「assinged」という単語が含まれています。

これは私のコードです:

Private Sub CommandButton2_Click()

    For Each cell In Columns("A")
        If ActiveCell.Value = Empty And ActiveCell.Offset(0, 1).Value = "Assigned" Then ActiveCell.Value = "Unknown"
    Next cell

End Sub   
4

3 に答える 3

8

ここでループする必要はありません。高速に実行される Excel 組み込みメソッドを利用してください。

Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False

    With ActiveSheet.UsedRange
        .AutoFilter Field:=1, Criteria1:=""
        .AutoFilter Field:=2, Criteria1:="Assigned"

        If WorksheetFunction.CountBlank(.Columns(1)) > 0 Then
            If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
                .Columns(1).SpecialCells(xlCellTypeBlanks).Value = "Unknown"
            End If
        End If

        .AutoFilter
    End With

    Application.ScreenUpdating = True

End Sub
于 2012-09-11T21:52:45.987 に答える
2

SOへようこそ。

このコードを試してください。それは少し速く動作し、あなたが望むものを手に入れるはずです。

更新:コードをより強力なものにしました!

Private Sub CommandButton2_Click()

Dim cel As Range, rngFind As Range, rngFilter As Range
Dim wks As Worksheet

Set wks = Sheets("sheet1")

With wks

    '-> Error check to make sure "blanks" exist
    Set rngFind = .Range("A1:A" & .Range("B" & Rows.Count).End(xlUp).Row).Find("", lookat:=xlWhole)

    If Not rngFind Is Nothing Then

        Set rngFilter = .Range("A1:B" & .Range("B" & Rows.Count).End(xlUp).Row)

        rngFilter.AutoFilter 1, "="

        '-> Error check to make sure "assigned" exists for blank cells
        Set rngFind = .Columns("B:B").SpecialCells(xlCellTypeVisible).Find("Assigned", lookat:=xlWhole)

        If Not rngFind Is Nothing Then
        '-> okay, it exists. filter and loop through cells

            rngFilter.AutoFilter 2, "Assigned"

            Set rngFind = Intersect(.UsedRange, .UsedRange.Offset(1), .Columns(1)).SpecialCells(xlCellTypeVisible)

            For Each cel In rngFind

                If cel.Offset(0, 1).Value = "Assigned" Then cel.Value = "Unknown"

            Next cel

        End If

    End If

End With


End Sub
于 2012-09-11T17:56:53.563 に答える
1

これを数回だけ行う必要がある場合は、

  1. 使用した範囲をテーブルとしてフォーマットします
  2. 列に「(空白)」のみを表示するフィルター
  3. 列Bのフィルターで、「assinged」のみを表示します
  4. 列Bで結果のセルをすべて選択します
  5. alt+を押し:て、表示されているセルのみを選択します
  6. 押すF2
  7. 「不明」と入力します
  8. ctrl+を押しますenter

あなたの悪いデータは今は良いはずです!

明らかに、これは非vbaベースのソリューションですが、コーディングを回避できる場合は、おそらく最善の方法です。

于 2012-09-11T19:13:02.697 に答える