• 締切済み

制御方法について

所属名毎にシートを作成し都道府県と所属名が一致したら集計させループさせたいのですがうまくいきません。 データには列135に所属名があり139に都道府県が入っています。 解約シートには6行目5列目から都道府県名が入っています。 最終が沖縄となるので沖縄が入れば抜けるようになっています。 今の状態で実行すると所属名の数毎、都道府県の件数を更にを集計してしまいます。 一度シートを作成した所属はFor~Nextを読み込まないようにしたいのですが 自分なりに制御させようと試みましたが上手く集計されません。 何かアドバイス等ありましたらお願いします。 Dim ingcnt As Integer Dim intHjn As Integer Dim strhjn As String Dim Areastrhjn As String Dim list_cnt As Integer Dim Arealist_cnt As Integer Dim (2) As Worksheet Dim Area_cnt As Integer With Worksheets("解約データ") Set (2) = Sheets("解約・所属別") list_cnt = 2 strhjn = "" Area_cnt = 5 '所属CD1毎のシート作成 Do While Trim$(.Cells(list_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す If strhjn <> .Cells(list_cnt, 135) Then strhjn = .Cells(list_cnt, 135) Sheets("解約").Select Sheets("解約").Copy Before:=Sheets("解約") Sheets("解約(2)").Name = strhjn ActiveSheet.Cells(1, 15) = strhjn End If For Area_cnt = 5 To (2).Cells(6, (2).Columns.Count).End(xlToLeft).Column Area = (2).Cells(6, Area_cnt) Arealist_cnt = 2 Areastrhjn = "" Do While Trim$(.Cells(Arealist_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す Areastrhjn = .Cells(Arealist_cnt, 135) 'エリア集計 If Areastrhjn = .Cells(Arealist_cnt, 135) And _ .Cells(Arealist_cnt, 139) = Area Then ActiveSheet.Cells(7, Area_cnt) = ActiveSheet.Cells(7, Area_cnt) + 1 End If Arealist_cnt = Arealist_cnt + 1 Loop If Area = "沖縄" Then Exit For Next list_cnt = list_cnt + 1 Loop End With End Sub

みんなの回答

回答No.5

Boolean型でTrueかFalseのフラグを立ててあげればいいです。 例えば、集計したときにTrueにする。 所属が変更になったらFalseにして集計をさせるようにする。 ※別にフラグはBooleanである必要性はありません。 StringでもIntegerでもかまいません。 Stringなら空白かそれ以外で判定、Integerなら0かそれ以外で判定すればいいことなので・・・ ------------------------------------------------------------------- Dim blnFlg As Boolean If strhjn <> .Cells(list_cnt, 135) Then strhjn = .Cells(list_cnt, 135) Sheets("解約").Select Sheets("解約").Copy Before:=Sheets("解約") Sheets("解約(2)").Name = strhjn ActiveSheet.Cells(1, 15) = strhjn 'フラグを戻す blnFlg = False End If '未処理の場合のみ処理を行う If (blnFlg = False) Then For Area_cnt = 5 To (2).Cells(6, (2).Columns.Count).End(xlToLeft).Column Area = (2).Cells(6, Area_cnt) Arealist_cnt = 2 Areastrhjn = "" Do While Trim$(.Cells(Arealist_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す Areastrhjn = .Cells(Arealist_cnt, 135) 'エリア集計 If Areastrhjn = .Cells(Arealist_cnt, 135) And _ .Cells(Arealist_cnt, 139) = Area Then ActiveSheet.Cells(7, Area_cnt) = ActiveSheet.Cells(7, Area_cnt) + 1 End If Arealist_cnt = Arealist_cnt + 1 Loop '処理を行ったのでフラグを立てる blnFlg = True If Area = "沖縄" Then Exit For Next End If ------------------------------------------------------------------- 大事なことなので何回も言いますがソースだけでは回答を出すのに難しい部分があります。 ソースも必要ですが、質問するのであればデータと結果があることが大前提です。

maki06
質問者

お礼

とりあえずなんとか集計できました。 kazuhisa01さんの意見も大変参考になりました! ありがとうございました!!

maki06
質問者

補足

毎回ご丁寧な返信誠にありがとうございます。 読み込むデータ項目として、所属名が135列目に存在し、都道府県が139列目 に存在しています。現在下記のデータで回答者様のプログラム通り実行させると 全ての所属のシートの集計が全て同じ結果で集計されてしまいます。 所属名1  都道府県 A社    青森 A社    秋田 A社    秋田 A社    岩手 A社    岩手 B社    青森 B社    青森 B社    秋田 B社    秋田 B社    岩手 C社    栃木 希望としている結果としてA社のシートを作成後青森1 秋田2 岩手2で集計し B社のシートを作成後青森2 秋田2 岩手1で集計、最後にC社のシートを作成し、栃木1で 集計し終了させるように集計しようとしています。

回答No.4

#3に補足追記します。 貴方がやりたい方式はどちらですか? ・存在するデータ件数を1件ずつ判定して行き集計 ・存在するデータを判定して一致した所属ごとFor文で集計 もし後者だとする場合 Do~Loopの処理の次は所属判定で所属が一致している場合はFor~Next内で集計しなければいけません。 しかし質問者様のコードはコードが一致していてもしていなくてもデータ件数分、所属に対する都道府県集計をしています。 そして所属が一致している間は集計処理を1回でよいのにデータ件数分処理しています。 集計済みなのか未集計なのかの判定が足りません。 集計方法は多数ありますが、違う集計方法を混ぜて使用しているため思い通りの結果を得られないのだと思います。

maki06
質問者

補足

返信ありがとうございます。 以前説明したように >所属名をシート名にしているのですが、strhjnとAreastrhjnで135列項目の >所属名を使用している為For~Nextで集計をしたあと、Do~Loopで同じ所属名 >が存在する回数分余計に集計されてしまいます。 >これを回避したいのですが。。。 なので回答者様が仰るように >集計済みなのか未集計なのかの判定が足りません。 この判定方法がわかりません。

回答No.3

データがどのような状態でならんでいるかがわからないので明確にしてほしい。 現状の結果も同時に提示して欲しい。 その上で原因が判明します。 データの並びが悪いのか、集計方法がいけないのか。

回答No.2

所属別シートを作成して都道府県別集計を行いたいということでいいでしょうか? 質問者様のコードを見る限り前提条件として ・所属別の都道府県別にセルがソートされていること となります。 どのようなデータが入っていてどのような結果が返ってくるという提示が無いので、コードのどこが悪いという指摘が困難です。 なので、こちらでコードを組んでみました。 ------------------------------------------------------------------------------------------- Private Sub btnJikko1_Click() Dim strShozoku As String Dim strToDoFuKen As String Dim lngMaxRow As Long Dim lngIndex As Long Dim lngToDoFuKenCount As Long Dim lngWriteCount As Long Dim shWkData As Worksheet '変数初期化 strShozoku = "" strToDoFuKen = "" lngWriteCount = 2 '編集元シートを指定 Set shWkData = Worksheets("解約・所属別") '最大行カウントを取得 '※ "A65536"はOfficeのバージョンによって変わります。 lngMaxRow = Range("A65536").End(xlUp).Row '列Aに入力されている最終行まで繰り返す For lngIndex = 1 To lngMaxRow '編集中の所属と行選択した所属を判定 If strShozoku <> shWkData.Cells(lngIndex, 135).Value Then '所属切り替わりの都道府県別情報格納処理 If strShozoku <> "" Then '都道府県を格納 Sheets(strShozoku).Cells(lngWriteCount, 15).Value = strToDoFuKen '件数を格納 Sheets(strShozoku).Cells(lngWriteCount, 16).Value = lngToDoFuKenCount '変数初期化 lngToDoFuKenCount = 1 lngWriteCount = 2 End If '都道府県変数に最初のデータを格納 strToDoFuKen = shWkData.Cells(lngIndex, 139).Value '変数に所属を格納 strShozoku = shWkData.Cells(lngIndex, 135).Value '解約シートを選択 Sheets("解約").Select 'シートの後ろにコピー Sheets("解約").Copy Before:=Sheets("解約") '名前を格納した所属に変更 ActiveSheet.Name = strShozoku '所属を格納? ActiveSheet.Cells(1, 15).Value = strShozoku End If '編集中の都道府県と行選択した都道府県判定 If strToDoFuKen = shWkData.Cells(lngIndex, 139).Value Then lngToDoFuKenCount = lngToDoFuKenCount + 1 Else '都道府県を格納 Sheets(strShozoku).Cells(lngWriteCount, 15).Value = strToDoFuKen '件数を格納 Sheets(strShozoku).Cells(lngWriteCount, 16).Value = lngToDoFuKenCount lngWriteCount = lngWriteCount + 1 '変数初期化 lngToDoFuKenCount = 1 strToDoFuKen = shWkData.Cells(lngIndex, 139).Value End If Next lngIndex '最終データ格納処理 '都道府県を格納 Sheets(strShozoku).Cells(lngWriteCount, 15).Value = strToDoFuKen '件数を格納 Sheets(strShozoku).Cells(lngWriteCount, 16).Value = lngToDoFuKenCount End Sub ------------------------------------------------------------------------------------------- 作成した所属シートの都道府県情報を書き込む場所は適当に指定しました。

maki06
質問者

補足

返信ありがとうございます。 説明が解りづらくて申し訳ないです。 For~Nextの中の集計は問題ないのですが、所属CD1毎のシートを作成してから For~Nextを集計させると正確な集計ができません。 所属名をシート名にしているのですが、strhjnとAreastrhjnで135列項目の 所属名を使用している為For~Nextで集計をしたあと、Do~Loopで同じ所属名 が存在する回数分余計に集計されてしまいます。 これを回避したいのですが。。。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

いろいろ考えてみましたが、いまいち何をやりたいのかつかめませんでした。 Areastrhjn = .Cells(Arealist_cnt, 135) の直後に、 If Areastrhjn = .Cells(Arealist_cnt, 135) And .Cells(Arealist_cnt, 139) = Area Then としていますが、このIf文は、 If .Cells(Arealist_cnt, 139) = Area Then と同じです。 (Areastrhjn = .Cells(Arealist_cnt, 135) の条件は必ず成立します) Areastrhjnに何の意味があるのか分かりません。 どんなデータのとき、今はどんな結果になって、それをどんな結果にしたいのかを、具体的な例を上げて示してくれませんか。

maki06
質問者

補足

(Areastrhjn = .Cells(Arealist_cnt, 135) の条件は必ず成立します) 確かに、そうですね。ありがとうございます!

関連するQ&A