Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4227 / 13644 ツリー ←次へ | 前へ→

【57785】オブジェクトの定義エラーになってしまいます。 jeanjean 08/9/13(土) 12:19 質問[未読]
【57788】Re:オブジェクトの定義エラーになってしま... かみちゃん 08/9/13(土) 12:51 発言[未読]
【57791】Re:オブジェクトの定義エラーになってしま... jeanjean 08/9/13(土) 13:24 お礼[未読]
【57792】Re:オブジェクトの定義エラーになってしま... かみちゃん 08/9/13(土) 13:34 発言[未読]
【57796】Re:オブジェクトの定義エラーになってしま... kanabun 08/9/13(土) 15:34 発言[未読]

【57785】オブジェクトの定義エラーになってしまい...
質問  jeanjean  - 08/9/13(土) 12:19 -

引用なし
パスワード
   Excelで作っている当番表を改定しようと思っています。
シート1に当番表、シート2に名簿があります。

シート1には、毎週末(土・日)の午前・午後の4つ枠があります。それぞれ当番は4人づつです。
シート2には、名前と当番に入れる時間帯のセルがあり、可能な時間帯に○が記入されています。


シート1の該当箇所に、シート2の名簿の中から条件に合う人をランダムに入力させたいと思っています。
名簿に入っている人数は200〜300人ですが、一通り1回づつ回ってから、2順目にいくようにしたいと思っています。

現在作成中のコードは下記のとおりですが、
ReDim Preserve のところの、

strOkMember(lngOkCount) = rngTimeColumn.Offset(j, (i + 1) * (-1)).Value

がエラーになってしまいます。
初心者なもので、なぜエラーになるのかわかりません。
説明が下手でわかりにくいと思いますが、
どうかご教示いただけますでしょうか?よろしくお願いいたしますm(__)m

''////////////////////////////////////////////////////////////
Sub PickUpTest()

Const SHEET_ONE As String = "当番表"
Const SHEET_TWO As String = "名簿"
Const FIELD_B As Integer = 2
Const FIELD_C As Integer = 3
Const INTER_CHAR As String = "・" '
Const OK_VALUE As String = "○"
Const TIME_BOX As Integer = 3
Const SELECT_MEMBER As Integer = 4
Dim strTimeArray(TIME_BOX) As String
Dim i As Long, j As Long


Randomize

For i = 0 To TIME_BOX
With Worksheets(SHEET_ONE)
strTimeArray(i) = _
.Cells(i + 1, FIELD_B) & INTER_CHAR & .Cells(i + 1, FIELD_C)
End With
Next


With Worksheets(SHEET_TWO)
Dim lngCheckRows As Long
lngCheckRows = .UsedRange.Rows.Count - 1

For i = 0 To TIME_BOX

Dim rngTimeColumn As Range
Dim strFirstFind As String
Dim strOkMember() As String
Dim lngOkCount As Long
Dim strSelectMember(SELECT_MEMBER - 1) As String
Dim lngUsedNumber(SELECT_MEMBER - 1) As Long
Dim lngRandNum As Long
Dim lngSelectCount As Long
Dim lngUsedCheck As Long

Set rngTimeColumn = _
.Range("1:1").Find(what:=strTimeArray(i), lookat:=xlWhole)
If Not rngTimeColumn Is Nothing Then

strFirstFind = rngTimeColumn.Address


lngOkCount = 0
For j = 1 To lngCheckRows
If rngTimeColumn.Offset(j, 0).Value = OK_VALUE Then

ReDim Preserve strOkMember(lngOkCount)
strOkMember(lngOkCount) = rngTimeColumn.Offset(j, (i + 1) * (-1)).Value
lngOkCount = lngOkCount + 1
End If
Next


If lngOkCount = 0 Then
ReDim strOkMember(0)
strOkMember(0) = "【みんなダメ!】"
End If

If UBound(strOkMember) < SELECT_MEMBER Then
For j = 0 To UBound(strOkMember)
Worksheets(SHEET_ONE).Cells(i + 1, FIELD_C + j + 1) = strOkMember(j)
Next
Else
lngSelectCount = 0
Do
lngRandNum = CLng(Int(Rnd() * lngOkCount))
If lngSelectCount = 0 Then
strSelectMember(lngSelectCount) = strOkMember(lngRandNum)
lngUsedNumber(lngSelectCount) = lngRandNum
lngSelectCount = 1
Else
lngUsedCheck = 1
For j = 0 To UBound(lngUsedNumber)
lngUsedCheck = lngUsedCheck * (lngRandNum - lngUsedNumber(j))
Next
If lngUsedCheck <> 0 Then
strSelectMember(lngSelectCount) = strOkMember(lngRandNum)
lngUsedNumber(lngSelectCount) = lngRandNum
lngSelectCount = lngSelectCount + 1
End If
End If
Loop Until lngSelectCount = SELECT_MEMBER
For j = 0 To UBound(strSelectMember)
Worksheets(SHEET_ONE).Cells(i + 1, FIELD_C + j + 1) = strSelectMember(j)
Next
End If

End If

Next

End With

End Sub

【57788】Re:オブジェクトの定義エラーになってし...
発言  かみちゃん E-MAIL  - 08/9/13(土) 12:51 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>Excelで作っている当番表を改定しようと思っています。
>シート1に当番表、シート2に名簿があります。
>
>シート1には、毎週末(土・日)の午前・午後の4つ枠があります。それぞれ当番は4人づつです。
>シート2には、名前と当番に入れる時間帯のセルがあり、可能な時間帯に○が記入されています。

シートイメージがよくわからないので、検証もできていないのですが、

>strOkMember(lngOkCount) = rngTimeColumn.Offset(j, (i + 1) * (-1)).Value
>
>がエラーになってしまいます。

以下のようなコードを記述して、エラーが出た時点で、イミディエイトウィンドウ
(初心者ということなのですが、わかりますか?)の最後に何が表示されているか
教えていただけますか?

   Debug.Print "rngTimeColumn.Column=" & rngTimeColumn.Column & " " & _
         "j=" & j & " " & _
         "i=" & i & " " & _
         "(i + 1) * (-1)=" & (i + 1) * (-1) & vbCrLf
   strOkMember(lngOkCount) = rngTimeColumn.Offset(j, (i + 1) * (-1)).Value

【57791】Re:オブジェクトの定義エラーになってし...
お礼  jeanjean  - 08/9/13(土) 13:24 -

引用なし
パスワード
   ▼かみちゃん さん:

かみちゃんさん、早速ありがとうございます。

・・・ただ、私は初心者すぎて、ちんぷんかんぷんです(>_<)
ちょっと基本から勉強し直してから、質問したいと思います。
何がわからないかわからないのに質問するのは非常識でした。
すみません(>_<)

【57792】Re:オブジェクトの定義エラーになってし...
発言  かみちゃん E-MAIL  - 08/9/13(土) 13:34 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>・・・ただ、私は初心者すぎて、ちんぷんかんぷんです(>_<)
>ちょっと基本から勉強し直してから、質問したいと思います。
>何がわからないかわからないのに質問するのは非常識でした。

えっ?何がわからないのですか?

イミディエイトウィンドウがわからないのですか?
Debug.Print 〜
のコードは、試されたのでしょうか?

これで、変数の内容を表示するようにしています。
その変数の内容で原因は、大体想像できます。

イミディエイトウィンドウは、以下などが参考になると思います。
http://excelvba.pc-users.net/fol8/8_1.html

もし、イミディエイトウィンドウの使い方がわからなければ、
Debug.Print 〜
の代わりに
MsgBox 〜
として、MessageBox に表示することもできます。

いずれにしても、変数の内容を確認させていただきたくその方法を示しただけで、
現時点で、難しい内容をお話したつもりはありません。

非常識云々というより、出直しを決心されるのが、早すぎるような感じがしました。

【57796】Re:オブジェクトの定義エラーになってし...
発言  kanabun  - 08/9/13(土) 15:34 -

引用なし
パスワード
   ▼jeanjean さん:

> 仮に他のサイトで解決したのなら、ここにも必ずその顛末を
> 書いてください。質問しっぱなし、というのはモラルに反します。

h t t p://moug.net/faq/viewtopic.php?t=32393
h t t p://www.moug.net/faq/viewtopic.php?t=32383

4227 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free