dポイントプレゼントキャンペーン実施中!

皆様のお力をお借りしたいッッッ!!!

A列~D列の内、三つの全て条件(約200種)に当てはまるパターンをカウントするのですが。。。
それが、2700行も....

めまいがしそうです。。。(><;)

表ですが
1、検索するのはA2~D2の4列に20種類ある文字の内からランダムに4つ入っており、約2700行まで続いています。
2、E2~G2に、20種類ある文字を3つを組み合わせたものを1種類とし、約200種(約200行)あります。各行の3つの文字、全てに当てはまることが条件となります。
3、H2に、条件に合うものの合計を表示する。



これらの事を行いたいのです。
AからDの中にある文字は、20種類の文字で形成されています。
並び順は無視します。
1行あたり4つのパターンが作れます。
それらも、1とカウントしますが、一つの行で重複する組み合わせはカウントしません。
  A B C D
例)SX XX SX SX
の場合、ABC、ABD、BCD、ACD、ですが、ABC、BCDは、同じなのでカウントしません。
オートフィルターを使ってみたのですが、一つの条件に合うか?どうか?を4通り、しかも、200種も調べねばならないのは、かなりキツイものが・・・(T T)。

どうか、お知恵を拝借させていただきたく存じます。

質問者からの補足コメント

  • つらい・・・

    紛らわしくてすみません!!
    例に挙げたABC、BCDは重複しますが各1、計2と、カウントせず、2個でも1個とします。

      補足日時:2015/09/22 17:33

A 回答 (3件)

こんばんは!



E~G列の3つのデータがA~D列の4セル内に含まれていたら「1」とカウントし
その行が何行あるかH列に表示したい!
という解釈です。
VBAになりますが一例です。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() 'この行から//
Dim i As Long, lastRow As Long, myRng As Range
Dim myArea1 As Range, myArea2 As Range, myArea3 As Range
Dim myFirst As Range, myFound As Range
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
Range("I:I").Insert
With Range(Cells(2, "I"), Cells(lastRow, "I"))
.Formula = "=A2&""_""&B2&""_""&C2&""_""&D2"
.Value = .Value
End With
Set myArea1 = Range(Cells(2, "I"), Cells(lastRow, "I"))
For i = 2 To Cells(Rows.Count, "E").End(xlUp).Row
Set myFound = myArea1.Find(what:=Cells(i, "E"), LookIn:=xlValues, lookat:=xlPart)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myArea2 = myFound
Do
Set myFound = myArea1.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myArea2 = Union(myArea2, myFound)
Loop
Set myFound = myArea2.Find(what:=Cells(i, "F"), LookIn:=xlValues, lookat:=xlPart)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myArea3 = myFound
Do
Set myFound = myArea2.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myArea3 = Union(myArea3, myFound)
Loop
Set myFound = myArea3.Find(what:=Cells(i, "G"), LookIn:=xlValues, lookat:=xlPart)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea3.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
If Not myRng Is Nothing Then
Cells(i, "H") = myRng.Count
End If
Else
Cells(i, "H") = 0
End If
Else
Cells(i, "H") = 0
End If
Else
Cells(i, "H") = 0
End If
Next i
Range("I:I").Delete
Application.ScreenUpdating = True
MsgBox "完了"
End Sub 'この行まで//

※ 解釈が違っていたらごめんなさいね。m(_ _)m
    • good
    • 1
この回答へのお礼

あ、ありがとうございますっっっ!!!
わかりにくい質問を解釈頂き、すばらしき回答をいただいたおかげで、
一発表示でカウントされましたッ!!!!
本当に、助かりましたッッッ m(_ _)m!!!

お礼日時:2015/09/26 11:15

エクセルの質問ですか?エクセルで大きなデータを自動的に扱うにはプログラム的な順次処理が必要ですので、マクロを使用し、判断(ifみたいのないですか?)など使って処理すると楽になります。

関数だけでやると大変そうですね。
    • good
    • 1
この回答へのお礼

随分、返信が遅くなり申し訳ございません。
ありがとうございました。

お礼日時:2019/07/21 10:49

1回でやろうとせず、複数回に分けてやられたらいかがですか?



恒久的に利用するものならともかく、何回か、便宜的に計算する場合は、わたしは、いちいち、細かなexcelの関数を使って作りません。

だいたい、excelとaccessを組み合わせて、何回か作業をすれば目的としたものは作れます。

1回でやろうとすると、そうとう時間がかかることや、関数記述ミスなどから、危険度が大きく、あとで、間違えて集計してしまい提出後に「間違えた」ではすまないので、わたしは、一回で計算するようなことはしません。

それと、どちらかというと、こういう分けた作業のほうが時間的に速く、出た結果も検証がしやすいです。 とくに、excelで複雑な関数を作る人がいまが、excelは関数が見えないので、あとで点検するのにすごい労力がかかりわたしは時間の無駄のように考えています。
    • good
    • 0
この回答へのお礼

随分、返信が遅くなり申し訳ございません。
ありがとうございました。

お礼日時:2019/07/21 10:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!