[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA countifによる処理』(天)
宜しくお願いします。
Sub test()
Dim r As Range
Set r = Worksheets("test").Cells(1).CurrentRegion
'CurrentRegionはデータがあるセルを取得する
With r.Columns(7)
.Formula = "=if(or(countif(A:A,E1)),true,"""")"
.Value = .Value
.SpecialCells(xlCellTypeConstants) = "ok"
End With
End Sub
このコードでA列すべてのデータに対してE列のデータが存在するかチェックしています。
追加でやりたいことは
同時にB列すべてのデータに対してF列のデータもチェックしたいのですが
それが分からずご教授ください。
4万件データがありかなり遅いのでもっと早い処理があれば
おしえて頂けると助かります。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
.Formula = "=IF(COUNTIF(A:A,E1),""ok"","""")"
.Value = .Value
ではダメなんですか?
>同時にB列すべてのデータに対してF列のデータもチェックしたいのですが
まったく同じようにすればよいのでは?
(γ) 2020/01/17(金) 08:37
データが4万件くらいなら・・
Sub TEST2()
Dim Data, fData
Dim n As Long, i As Long
With Worksheets("test")
For n = 1 To 2
Data = WorksheetFunction.Transpose(.Columns(n).Value)
For i = 1 To .Cells(.Rows.Count, n + 4).End(xlUp).Row
fData = Filter(Data, .Cells(i, n + 4).Value)
.Cells(i, n + 8).Value = IIf(UBound(fData) > 0, "ok", "-")
Next i
Next n
End With
End Sub
(ろっくん) 2020/01/17(金) 09:24
Dim c As Range
Worksheets("test").Range("G:G").ClearContents
For Each c In Worksheets("test").Range("E:F").SpecialCells(2)
If Not c.Offset(, -4).EntireColumn.Find(c.Value) Is Nothing Then
Worksheets("test").Cells(c.Row, 7).Value = Cells(c.Row, 7).Value & Left(c.Address(0, 0), 1) & "列oK"
End If
Next c
End Sub
(mm) 2020/01/17(金) 10:14
検証してみましたが
.Cells(i, n + 8).Value = IIf(UBound(fData) > 0, "ok", "-") ここの処理でうまくいかず、実際にはデータがあるのでOKのはずが-になってしまって
分かりませんでした。
(天) 2020/01/17(金) 22:20
こんばんは!
方法は色々あると思いますし、、データの取得方法にもよると思いますが、 私だったら、、データを一括で取得して、、 A列のE列、G列とかB列のF列、H列とある程度の規則性があるのなら
ループの外でデータを一括で取得してループを抜けた後に一括で出力する
読み込んで、またループして、、と面倒に思われるかもしれませんが、、 要は、セルへのアクセスする回数を減らすことだと思います。
今回の例では、、1回です。
でも、、今回の様なやり方は本当は早くないです。 出力する配列は別に用意した方が早いです。
その辺は、お勉強していただくとして、、 あるか?ないか?だけなら定番ですけど、ディクショナリーがいいと思います。
まぁ、、何かの参考にでもなれば幸いです。
では、、では、、
Option Explicit
Sub てすと()
Dim MyDic As Object
Dim MyA As Variant
Dim i As Long
Dim n As Long
Set MyDic = CreateObject("Scripting.Dictionary")
With Worksheets("test")
MyA = .Range("A1").CurrentRegion.Resize(, 8).Value
For n = 0 To 1
For i = LBound(MyA, 1) To UBound(MyA, 1)
MyDic(MyA(i, 1 + n)) = Empty
Next
For i = LBound(MyA, 1) To UBound(MyA, 1)
If MyDic.Exists(MyA(i, 5 + n)) Then MyA(i, 7 + n) = "Ok"
Next
MyDic.RemoveAll
Next
.Range("A1").Resize(UBound(MyA, 1), UBound(MyA, 2)).Value = MyA
End With
Set MyDic = Nothing
Erase MyA
End Sub
(SoulMan) 2020/01/17(金) 22:29
衝突しました。
お邪魔してましたら、、ごめんなさいです。。m(__)m (SoulMan) 2020/01/17(金) 22:31
CountIfが遅いんですかねぇ。。。
体感でもいいので何秒とか何分とか教えてください。
あと、データはどのような物でしょうか?
数値?文字列?
あと、検索するセル範囲で値の並び替えは可能でしょうか?
Sub test2()
Dim Rng1 As Range
Dim Rng2 As Range
Const myFormula As String = "=IF(COUNTIF(XXXX,E1),""OK"",NA())"
Application.Calculation = xlCalculationManual
Set Rng1 = ActiveSheet.Range("A1").CurrentRegion.Columns(1)
Set Rng2 = ActiveSheet.Range("E1").CurrentRegion
Set Rng2 = Rng2.Offset(, Rng2.Columns.Count)
With Rng2
.Formula = Replace(myFormula, "XXXX", Rng1.Address(True, False))
.SpecialCells(xlCellTypeFormulas, xlErrors).ClearContents
.Copy
.PasteSpecial xlPasteValues
End With
Application.Calculation = xlCalculationAutomatic
End Sub
関係ないかも知れないけど、
再計算を一旦止めてみるのと、
コピペ使って値に変えるとか(遅くなるかも)、
やってみたらどうなるのでしょうか?
(まっつわん) 2020/01/17(金) 23:45
ありがとうございます。
(天) 2020/01/18(土) 11:36
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.