1

手動で 90 件のレコードをスキャンした後、自動化を利用しない限り、これは苦痛で退屈なものになることに気付きました。

追跡したいパターンで発生する約 4000 レコードのデータ セットがあります。最初の列が重要です。列をスキャンして、その数が何回発生したかを新しい列に記録したいと思います。Excelでプログラム的にこれを行うことは可能ですか?

注: 単一のパターンまたはパターンの単一の出現を探しているだけではありません。

たとえば、このサンプルでは、​​313 が 1 回、314 が 6 回、315 が 2 回発生します。

発生の終わりに、次のようにしたい

--- Desired Output -------

313 1       343  1
314 1   344  
314 2   344 
314 3   344
314 4   344
314 5   344  
314 1   345  6
315 2   345  
315 1   346  2


-- Sample Data ------------------------------------
313 1   343
314 1   344
314 2   344
314 3   344
314 4   344
314 5   344
314 1   345
315 2   345
315 1   346
316 2   346
316 1   347
317 2   347
318 1   348
318 2   348
319 1   349
319 2   349
319 3   349  

5/23/13 データはスペースで区切られています。すべてが 1 つのセルにあるわけではありません。ここでグリッド画像を作成する方法がわかりません。左端のセルは、数えたいセルです。

望ましい出力は、私が望むものの例です。314 は 6 回出現します。最後の出現の行にカウント サマリー セルをコンパイルする必要があります。

4

4 に答える 4

1

私は後退し、速度を落とし、基本的なプログラミングの原則に進みました。

  1. フローチャート
  2. 疑似コード
  3. プロトタイプ
  4. テスト
  5. 必要に応じて 3 と 4 を繰り返します。

次のコードがまさに必要なことを実行することがわかりました。フォローしてくださった方にシェアします。

Sub countFoo()
Dim startCell As Range
Dim preCell As Range
Dim counter As Integer
Dim startPoint As Range, endPoint As Range
Dim fileName As String, delimitingCharacter As String, SQLpre As String, SQLpost As String
Dim SQL As String
Dim outfile As Integer

fileName = "update_foo.sql"
SQLpre = "UPDATE foo SET foodata = "
SQLpost = " WHERE details = '"
outfile = FreeFile()
Open fileName For Output As outfile
counter = 1

Set startPoint = Cells(2, 4)
startPoint.Activate

Debug.Print "Start Point:" & startPoint.Address
Debug.Print startPoint.Value

Set startCell = ActiveCell
Set preCell = startCell.Offset(-1, 0)


Do While startCell.Value <> "END"

If (startCell.Value = preCell.Value) Then
  counter = counter + 1
  Set preCell = startCell
  Set startCell = startCell.Offset(1, 0)
ElseIf ((startCell.Value <> preCell.Value) Or (startCell.Value = "END")) Then
  startCell.Offset(-1, 3).Value = counter
  If counter > 1 Then
    startCell.Offset(-1, 0).Interior.Color = 5296274
    startCell.Offset(-1, 1).Interior.Color = 5296274
    startCell.Offset(-1, 2).Interior.Color = 5296274
    startCell.Offset(-1, 3).Font.Bold = True
    With startCell.Offset(-1, 3).Interior
      .Pattern = xlGray8
      .PatternColor = 65535
      .Color = 5296274
    End With
  End If
  SQL = SQLpre & counter & SQLpost & startCell.Offset(-1, 0).Value & "';"
  Print #outfile, SQL
  counter = 1
  Set preCell = startCell
  Set startCell = startCell.Offset(1, 0)
End If
Loop
Close #outfile
End Sub
于 2013-06-03T06:06:16.377 に答える
0

これを D1 に貼り付けて下にドラッグします。

=IF(A2<>A1,COUNTIF($A$1:$A$100000,A1),"")

必要に応じて範囲を調整します。この数式は、最初の 3 桁が独自のセルにあることを前提としています。

サンプル データがすべて 1 つの列にある場合は、countif の代わりに関数Sumproductを使用する必要があります。Leftこの場合、次の式を使用できますが、サンプル データが 3 列にある場合は、間違いなく高速な式を使用してください。

=IF(LEFT(A1,3)<>LEFT(A2,3),SUMPRODUCT(--(LEFT($A$1:$A$100000,3)=LEFT(A1,3))),"")

編集あなたのコメントと回答に基づいて、可能であればcountifVBAは常に避けるべきであるため、メソッドの使用に関する完全なガイドを作成しました。質問で提供されたサンプル データにヘッダー/列ラベルが含まれていなかったため、問題が発生しました。ここの列ラベルは固定ガイドです。

ヘッダー付きの 3 つの列から始めて、組み込みの Name Manager を使用してカウントを行いたい列に名前付き範囲を作成し、[新規] をクリックします。

ネームマネージャー 新規

次に、この Set the Name to からCountColumn、Formula で次を使用します。

=OFFSET($A$2,0,0,COUNTA($A$2:$A$1000000),1)

ネームマネージャーフォーミュラ

元の回答の修正版を使用して、 cell に次のように入力しますD2

=IF(A3<>A2,COUNTIF(CountColumn,A2),"")

方式

上に示したように、これは で求められた元の質問と同じDesired Outputです。

これをさらに進めて、VBA コードが行うようにハイライトを取得するには、次を使用します。

の場合と同様に、Name Manager に戻り、CountColumn別の新しい名前付き範囲を作成し、SumsすべてのA参照をD次のように変更します。

=OFFSET($D$2,0,0,COUNTA($D$2:$D$1000000),1)

SumsNamed

Name Manager は次のようになります。

ネームマネージャー2

次に、名前ボックス (数式バーの横にある左上のボックス) に単語を入力しSumsて、合計領域全体を選択し、書式設定できるようにします。

合計

次に、****sums領域が強調表示されている間***、条件付き書式 ~~> 新しいルールに移動します。

ここに画像の説明を入力 組み込みの空白なし関数を使用します。

空白なし

次に、フォーマット Use Fill と必要な色について、投稿された数式に基づいて、緑色を使用しました。

フィルグリーン

これで完了です。データは次の図のようになります。

終了

于 2013-05-20T00:44:30.207 に答える
0

以下は、データがすべて 1 つの列にあることを前提としています (例: "315 1 344"1 つのセルです) 。

A1 から始めて sheet1 を調べ、一意のセル値のリストを生成し、重複をカウントします。すべてのレコードがチェックされると、結果が sheet2 に出力されます。

Sub Main()
' this requires you to add a reference to "Microsoft Scripting Runtime" (usefull if you do not know the methods of scripting.dictionary)
'Dim Results As New Scripting.Dictionary
' the line does not require you to add any extra references (there is no code-completion, you must know the methods and their arguments)
Dim Results As Object: Set Results = CreateObject("Scripting.Dictionary")
Dim Data As Variant
Dim Key As Variant
Dim Source As Worksheet: Set Source = ThisWorkbook.Worksheets("Sheet1") ' the sheet where your data is
Dim Destination As Worksheet: Set Destination = ThisWorkbook.Worksheets("Sheet2") ' where the results will be put
Dim Row As Long: Row = 1 ' the row number to start from
Dim Item As String
Data = Source.UsedRange.Value2
' iterate over the data
Do
    Item = Data(Row, 1)
    If Results.Exists(Item) = True Then
        Results(Item) = Results(Item) + 1
    Else
        Results(Item) = 1
    End If
    Row = Row + 1
Loop While Not Data(Row, 1) = ""
' display the output
Destination.Cells.Clear ' reset the worksheet
For Each Key In Results.Keys ' loop through the results
    Destination.Range("A1:B1").Insert xlShiftDown ' move the previous results down
    Destination.Cells(1, 1) = Key
    Destination.Cells(1, 2) = Results(Key)
Next Key

End Sub
于 2013-05-20T01:54:53.663 に答える
0

特定の範囲内の特定の数の出現回数を数えることだけが必要な場合は、COUNTIF(range,criteria) を使用するだけです。

ここで、範囲はチェックしたいセルです(あなたによれば、「A1:A4000」になります)、基準は探している数です。また、セルの数をカウントする「> 55」のようなオカレンスにすることもできます値が 55 より大きい。

お役に立てば幸いです、ブルーノ

コメントで言及したコード:

CurrentRowA = 1
LastRowA = Range("A50000").End(xlUp).Row
Dim r As Range
While CurrentRowA <= LastRowA
    CurrentRowB = 1
    LastRowB = Range("B50000").End(xlUp).Row
    Do While CurrentRowB <= LastRowB
        If Cells(CurrentRowA, "A").Value = Cells(CurrentRowB, "B").Value Then
            Exit Do
        Else
        CurrentRowB = CurrentRowB + 1
        End If
    Loop
    If CurrentRowB > LastRowB Then
        Cells(CurrentRowB, "B").Value = Cells(CurrentRowA, "A").Value
        Set r = Range("A1", "A" & LastRowA)
        Cells(CurrentRowB, "C").Value = Application.CountIf(r, Cells(CurrentRowA, "A").Value)
    End If
    CurrentRowA = CurrentRowA + 1
Wend
LastRowB = Range("B50000").End(xlUp).Row
Range("B2", "C" & LastRowB).Cut
Range("B1").Select
ActiveSheet.Paste

私の最新のコメントで説明したことが本当に必要な場合は、この式を B1 =COUNTIF($A$1:A1;A1) に貼り付けて最後のセルにドラッグするか、その黒い四角をダブルクリックするだけですB1 ボトムタイトコーナー、計算が自動なら完了、手動なら今すぐ計算をクリックして完了

お役に立てば幸いです、ブルーノ

于 2013-05-19T21:40:42.683 に答える