VBAのコードエラーの原因を教えていただきたいです。

Anonymous
2023-10-28T12:55:50+00:00

Sub CreateRotatingRolesAndGroups()

Dim TotalParticipants As Integer

Dim Participants() As String

Dim Roles() As String

Dim Groups() As String

Dim CurrentRound As Integer

Dim GroupSize As Integer

Dim i As Integer, j As Integer

Dim OutputRow As Integer

Dim ws As Worksheet

' グループのサイズと総参加者数を設定

GroupSize = 4 TotalParticipants = 40 ' A組とB組合わせた参加者数

' 役割の配列を作成

Roles = Array("A", "B", "C", "D")

' 参加者の名前を設定

ReDim Participants(1 To TotalParticipants)

For i = 1 To TotalParticipants

Participants(i) = "参加者" & i

Next i ' グループ数を計算

ReDim Groups(1 To TotalParticipants)

For i = 1 To TotalParticipants

Groups(i) = "グループ" & CStr((i - 1) / GroupSize + 1)

Next i

' 新しいワークシートを作成

Set ws = Worksheets.Add

' 各ラウンドでのグループと役割を割り当てる

OutputRow = 1 CurrentRound = 1

Do

If CurrentRound >= 1 And CurrentRound <= 6 Then

' 1回目から6回目は同じ組の中からグループ分け

ShuffleArray Groups

Else

' 7回目はA組、B組から2名ずつをランダムに選択

RandomlySelectFromGroups Groups, 2, "A"

RandomlySelectFromGroups Groups, 2, "B"

End If

' グループと役割をシャッフル

ShuffleArray Groups

ShuffleArray Roles

' グループと役割をワークシートに書き込む

For i = 1 To TotalParticipants

ws.Cells(OutputRow, 1).Value = Participants(i)

ws.Cells(OutputRow, 2).Value = Groups(i)

ws.Cells(OutputRow, 3).Value = Roles(i Mod 4)

OutputRow = OutputRow + 1

Next i

CurrentRound = CurrentRound + 1

Loop Until CurrentRound > 12

' 12回分の割り当てを行う

End Sub

Sub ShuffleArray(ByRef Arr() As String)

Dim Temp As String

Dim i As Long, j As Long

' Fisher-Yates シャッフルアルゴリズムを使用

For i = UBound(Arr) To LBound(Arr) Step -1

j = Int((i - LBound(Arr) + 1) * Rnd + LBound(Arr))

Temp = Arr(i)

Arr(i) = Arr(j)

Arr(j) = Temp

Next i

End Sub

Sub RandomlySelectFromGroups(ByRef Groups() As String, ByVal Count As Integer, ByVal GroupPrefix As String)

Dim i As Integer, j As Integer

Dim GroupIndices() As Integer

Dim AvailableGroupIndices() As Integer

ReDim GroupIndices(1 To UBound(Groups))

ReDim AvailableGroupIndices(1 To UBound(Groups))

' GroupPrefix に一致するグループのインデックスを取得 j = 0

For i = 1 To UBound(Groups)

If Left(Groups(i), Len(GroupPrefix)) = GroupPrefix Then

j = j + 1

GroupIndices(j) = i

End If

Next i

' 利用可能なグループのインデックスを初期化

For i = 1 To UBound(Groups)

AvailableGroupIndices(i) = i

Next i

' GroupIndices からランダムに Count 個のグループを選択

For i = 1 To Count

j = Int((UBound(GroupIndices) - 1 + 1) * Rnd + 1)

Groups(GroupIndices(j)) = "Selected"

GroupIndices(j) = GroupIndices(UBound(GroupIndices))

ReDim Preserve GroupIndices(1 To UBound(GroupIndices) - 1)

Next i

End Sub

このコードで Roles = Array("A", "B", "C", "D")のところで、実行時エラー:13型が一致しませんとエラーメッセージが出ます。どこを修正すればこのVBAが動くのかわかりません。型をStringではなく、Variantにしてもうまく動かず困っています。
どうぞよろしくお願いいたします。

Microsoft 365 と Office | Excel | 家庭向け | MacOS

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

14 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2023-10-30T02:52:16+00:00

    Array()で値を入れる場合、宣言は

    Dim Roles As Variant

    ですね。

    Dim Roles() As String を使うなら

    ReDim Roles(3) '配列初期化

    Roles(0) = "A"

    Roles(1) = "B"

    Roles(2) = "C"

    Roles(3) = "D"

    という感じです。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Hebikuzure aka Murachi Akira 327.9K 評価のポイント MVP ボランティア モデレーター
    2023-10-29T03:43:27+00:00

    Array() は Variant 型の配列を返すので「型が一致しません」になるのでは?

    「型をStringではなく、Variantにしてもうまく動かず」がどう動かないのか分かりませんが、以下のようにするとどうでしょう。

    Dim Roles

    Roles = Array("A", "B", "C", "D")

    Array 関数 (Visual Basic for Applications) | Microsoft Learn

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. motosan 3,310 評価のポイント
    2023-10-28T14:56:49+00:00

    VBA勉強中 さん

    何かをサンプルにしてコーディングされていると思いますが、

    インターネットで検索すると色々なサンプルが見つかります。

    今回の質問では "excel vba array" のように excel vba と一緒に指定すれば簡単な array の使用例がみつかるので、それを参考にすればわかると思います。

    また、検索キーワードに msdnを含めるとMicrosoft のサイトが探しやすくなります。(msdn は Microsoft Developer Network の略です)

    以上、ご参考までに。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2023-10-28T14:13:39+00:00

    アドバイスありがとうございます。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  5. simo-k 87,880 評価のポイント ボランティア モデレーター
    2023-10-28T13:22:15+00:00

    VBAの公式サポート場所は海外コミュニティとなります。

    VBA(マクロ)に関しては、海外コミュニティで聞いて下さい。

    Stack Overflow(VBA)

      [VBA プログラミングに関する質問]

      Stack Overflow には、説明的なタイトル、完全で簡潔な問題ステートメント、問題を再現する
      ための十分な詳細の要求などのガイドラインがあることに注意してください。
      機能要求または過度に広範な質問は、トピック外と見なされます。
      新しいユーザーの場合は、Stack Overflow ヘルプ センター にアクセスして詳細を確認して下さい。

    ※ 閲覧者・回答者が多い公式サポートサイトをお勧めします。

      英語で質問を送信してください。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません