ここから本文です

エクセルファイルで、行が10万行程度ある場合、COUNTIFをクラッシュさせずに入れる...

tor********さん

2019/10/811:42:05

エクセルファイルで、行が10万行程度ある場合、COUNTIFをクラッシュさせずに入れる方法はないでしょうか?
VBAだと可能ですか?
FormulaR1C1で入れたのですが、どうしても計算に時間がかかり

ます。

閲覧数:
168
回答数:
5
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

Chiquilinさん

2019/10/812:15:55

PowerQuery(取得と変換機能)で集計すればいいでしょう。

質問した人からのコメント

2019/10/14 21:37:43

色々検討してみたところ、パワークエリを使うことになりました。ありがとうございました。

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

30246kikuさん

2019/10/915:01:42

雰囲気、以下でどうなりますか

Samp1 を実行してみます

確認用データが必要なら testData を実行後、試してみます
testData 実行で、一旦シートクリアするので・・・
A 列だけが出来上がります

どうなりますか


Option Explicit

Public Sub Samp1()
   Dim dic As Object
   Dim vA As Variant
   Dim i As Long, n As Long

   Set dic = CreateObject("Scripting.Dictionary")

   With ActiveSheet
      With .Range("A1", .Cells(Rows.Count, "A").End(xlUp))
         vA = .Value
         For i = 1 To UBound(vA)
            n = dic(vA(i, 1))
            n = n + 1
            dic(vA(i, 1)) = n
            vA(i, 1) = n
         Next
         .Offset(, 1).Value = vA
      End With
   End With

   Set dic = Nothing
End Sub


' 確認用データ作成

Public Sub testData()
   Dim vA As Variant
   Dim sS As String
   Dim i As Long, n As Long
   Const CRN As Long = 1000 ' 乱数範囲 1 ~ CRN

   Randomize

   sS = InputBox("何行 ?", , 100000)
   If (sS = "") Then Exit Sub
   n = Val(sS)
   If (n < 2) Then n = 2

   ReDim vA(1 To n, 1 To 1)

   For i = 1 To n
      vA(i, 1) = Chr(Asc("A") + Int(26 * Rnd())) _
               & Format(Int(CRN * Rnd()) + 1, "00000")
   Next

   Cells.Delete
   Range("A1").Resize(n).Value = vA
End Sub

lgk********さん

2019/10/904:19:23

このような場合、並べ替えをして上下を比較して元に戻すのが早いです。
Excel のSortは100000行ぐらいあっという間です。

以下は、A列にデータがあり、B列に出現回数を数えるサンプルです。
B2 =COUNTIF(A$1:A1,A2)を入れ、下にコピペしたのと同じ結果になります。
1秒程度で済みます。
'
Option Explicit
'
Sub Macro1()
'
    Dim Row As Long
'
    Row = Cells(Rows.Count, "A").End(xlUp).Row
    [C:C].Insert
    [C1] = 1
    Range("C1:C" & Row).DataSeries
    Range("A1:C" & Row).Sort [A1]
    [B1] = 0
    Range("B2:B" & Row) = "=IF(A1=A2,B1+1,0)"
    Range("A1:C" & Row) = Range("A1:C" & Row).Value
    Range("A1:C" & Row).Sort [C1]
    [C:C].Delete
End Sub

数える範囲、結果を出す範囲、どのように数えるのかを変身していただければ直します。
似たような質問がありました。同じ方ですか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q142145418...

2019/10/816:00:28

10万行もあるデータに対してセルに計算式を入れて処理するという考え方自体を捨てたほうがいい

プロフィール画像

カテゴリマスター

taihenda****さん

2019/10/814:26:51

Sum関数などに比べるとCountif関数はかなり重い関数です。Countif関数を使わない方法を考えるべきです。たとえばDictionaryオブジェクトを使う、とか、

IFで分岐して配列に入れる、とかでもDictionaryオブジェクトほどではないですが、Countif関数よりは速いと思います。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる