データの分析、グラフ作成、および通信のためのツールを備えた Microsoft 表計算ソフトウェアのファミリ。
Array()で値を入れる場合、宣言は
Dim Roles As Variant
ですね。
Dim Roles() As String を使うなら
ReDim Roles(3) '配列初期化
Roles(0) = "A"
Roles(1) = "B"
Roles(2) = "C"
Roles(3) = "D"
という感じです。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
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 表計算ソフトウェアのファミリ。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
Array()で値を入れる場合、宣言は
Dim Roles As Variant
ですね。
Dim Roles() As String を使うなら
ReDim Roles(3) '配列初期化
Roles(0) = "A"
Roles(1) = "B"
Roles(2) = "C"
Roles(3) = "D"
という感じです。
Array() は Variant 型の配列を返すので「型が一致しません」になるのでは?
「型をStringではなく、Variantにしてもうまく動かず」がどう動かないのか分かりませんが、以下のようにするとどうでしょう。
Dim Roles
Roles = Array("A", "B", "C", "D")
VBA勉強中 さん
何かをサンプルにしてコーディングされていると思いますが、
インターネットで検索すると色々なサンプルが見つかります。
今回の質問では "excel vba array" のように excel vba と一緒に指定すれば簡単な array の使用例がみつかるので、それを参考にすればわかると思います。
また、検索キーワードに msdnを含めるとMicrosoft のサイトが探しやすくなります。(msdn は Microsoft Developer Network の略です)
以上、ご参考までに。
アドバイスありがとうございます。
VBAの公式サポート場所は海外コミュニティとなります。
VBA(マクロ)に関しては、海外コミュニティで聞いて下さい。
[VBA プログラミングに関する質問]
Stack Overflow には、説明的なタイトル、完全で簡潔な問題ステートメント、問題を再現する
ための十分な詳細の要求などのガイドラインがあることに注意してください。
機能要求または過度に広範な質問は、トピック外と見なされます。
新しいユーザーの場合は、Stack Overflow ヘルプ センター にアクセスして詳細を確認して下さい。
※ 閲覧者・回答者が多い公式サポートサイトをお勧めします。
英語で質問を送信してください。