Excel VBA 質問スレッド №1944 (未解決)

配列を使ったコードの書き方について

投稿者 : 初心者     投稿日時 : 2024/06/25(Tue) 21:40:36     OS : 未指定     EXCEL : 未指定
【至急教えてください!】

下記コード(一部省略)を使用して、あるシートに都道府県別の一覧表を支社ごとに案件数をまとめたいのですが、実際の数字が全く合いません。。

ほぼ「0」とカウントされます。

AIに質問しながらなんとか作成しましたが、支社などの変数の定義などがおかしいのかなと思っているのですが、、

 ' 変数の宣言
 Dim 部署, 対象月, 対象年度, 比較対象年度 As String
 Dim row, col, count, count_2, k, j As Integer
 Dim wb As Workbook
 Dim ws As Worksheet
 Dim 件数_一般 As Worksheet
 Dim 合計, 支社案件数() As Long
 Dim 開始日, 終了日 As Date
 
 対象年度 = ThisWorkbook.Sheets(1).Range("C7").Value
 比較対象年度 = ThisWorkbook.Sheets(1).Range("C6").Value
 対象月 = "6月"
 開始日 = "2024/06/01"
 終了日 = "2024/06/30"
 
 ' 各都道府県を配列に格納 
 Dim Array_都道府県 As Variant 
 Array_都道府県 = Array("大阪府", "兵庫県", "福井県", "沖縄県")
 
 ' 各支社と都道府県の対応を定義 
 Dim Array_大阪本社, Array_神戸兵庫 As Variant
 Array_大阪本社 = Array("大阪府", "福井県", "沖縄県")
 Array_神戸兵庫 = Array("兵庫県")
 
 ' 支社ごとの都道府県をまとめた配列
 Dim Array_支社 As Variant 
 Array_支社 = Array(Array_大阪本社, Array_神戸兵庫)
 
 ' 支社名の配列
 Dim 支社名 As Variant
 支社名 = Array("大阪本社", "神戸兵庫")
 
 Set wb = Workbooks(●●.xlsx")
 Set ws = wb.Sheets("●●")
 
 ' 各支社の案件数を初期化
 ReDim 支社案件数(0 To UBound(Array_支社))
 
 '件数_一般のC列6から28行目に記載された部署ごとに、条件に合った案件数を数える
 For col = 6 To 28
 
 ' 列初期値の設定
 row = 5
 
 '部署の設定
 If col = 16 Or col = 27 Then
 col = col + 1
 End If
 
 部署 = 部署FY_対象年度.Cells(col, 1).Value
 
 ' 各支社ごとに案件数をカウント
 For k = 0 To UBound(Array_支社)
 
 合計 = 0
 
 For j = 0 To UBound(Array_支社(k))
 
 合計 = 合計 + WorksheetFunction.CountIfs(ws.Range("AP:AP"), ">=" & 開始日, _
 ws.Range("AP:AP"), ">=" & 終了日, _
 ws.Range("O:O"), 部署, _
 ws_.Range("J:J"), Array_支社(k)(j))
 
 Next j
 
 支社案件数(k) = 合計
 
 件数_一般.Cells(col, row).Value = 合計
 
 row = row + 6
 
 Next k
 
 Next col
 
 End Sub

スポンサーリンク
[返信 1] Re : 配列を使ったコードの書き方について
投稿者 : さんこう     投稿日時 : 2024/06/25(Tue) 23:36:40
>支社などの変数の定義などがおかしいのかなと思っているのですが、、

何をしようとしているのかはっきりしないのでなんともいえませんが、定義は問題ないように思います。

いずれにしても、「WorksheetFunction.CountIfs」の条件を確認してみてはいかがでしょうか。

条件を減らしてみて何らかの数値が出てくることを確認しながら、条件を増やしていくといいでしょう。

まずは、このくらいにしてみるとか。

合計 = 合計 + WorksheetFunction.CountIfs(ws.Range("J:J"), Array_支社(k)(j))

[返信 2] Re : 配列を使ったコードの書き方について
投稿者 : てらてら     投稿日時 : 2024/06/26(Wed) 06:17:17
こんにちは。

コードの省略があるようなので検証できませんが、
まず変数の宣言がダメです。
> Dim 部署, 対象月, 対象年度, 比較対象年度 As String
これだと、最後以外は全てバリアント型になってしまいます。
Dim 部署 As String, 対象月 As String, 対象年度 As String, 比較対象年度 As String

変数型を決めておくことで、エラーに気付きやすくなります。

それと、
>部署 = 部署FY_対象年度.Cells(col, 1).Value
の"部署FY_対象年度"がどこにも宣言されていませんので検証できません。


あと、
> WorksheetFunction.CountIfs(ws.Range("AP:AP"), ">=" & 開始日, _
> ws.Range("AP:AP"), ">=" & 終了日, _
> ws.Range("O:O"), 部署, _
> ws_.Range("J:J"), Array_支社(k)(j))

これですが、開始日と終了日の比較演算子が同じなので、これだと、開始日と終了日が同じものしか対象にならないと思います。

この手のプログラムは複雑になりがちなので、ある部署のみ固定するなどでテストしてから範囲を広げていった方がうまく行くと思います。

[返信 3] Re : 配列を使ったコードの書き方について
投稿者 : what     投稿日時 : 2024/06/26(Wed) 13:29:55
>Dim 開始日, 終了日 As Date

因みにDate型変数は、終了日だけ
開始日の方は、Variant型
これ覚え始めの時よくやるやつだけど
自分で確認しようとしないところがなんとも・・・
私は、自分で確認を取りました

また、Date型はコントロールパネル地域と時計の
地域の短い方の形式に準じます
CountIfは、文字を使いますから
形式を、yyyy/mm/ddの文字を使った方が安全では
エクセルが自動で変化させて使う場合もある

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-07-02 23:06:46 )
タイトルとURLをコピーしました