こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

マクロについて教えてください。

マクロ初心者です。以下について教えてください。

1.B1~B5までの範囲内にA1~A5までのデータをランダムに1つづつ貼り付ける
2.もしB1にデータが入力されていたら、ひとつ下へデータを貼り付ける
3.これを、B5まで繰り返す

If Range("B1)=""Then
Range("B1").value=Range("A1").Value
Else
Range("B1").Offset(1,0).Select
( ? )←ここに何か入れれば表示されますか?

これだと、B1にセルが移動しただけで終わりになってしまいます。移動した先にデータを貼り付けるにはどうすればよいですか??

よろしくお願いします。

投稿日時 - 2011-10-07 12:48:07

QNo.7056896

すぐに回答ほしいです

質問者が選んだベストアンサー

Range("B1").Offset(1,0).Value=Range("A1").Value
ってこと?

投稿日時 - 2011-10-07 13:38:36

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

あ、貼り付け元のデータは重複していい・・・つか、重複するんですかね? だとすると、もっとシンプルに行けるかも。

Sub TEST2()
Randomize
Do
J = Application.RoundDown(Rnd * 5, 0)
Range("A1").Offset(J, 0).Copy
Range("B1").Select
I = 0
Do Until Selection.Value = 0
Selection.Offset(1, 0).Select
I = I + 1
Loop
ActiveSheet.Paste
Loop Until I = 4
End Sub

こうすると、B1にはA1~A5のどれかを、B2にはB1の数値と関係なくA1~A5のどれかを・・・と貼り付けます。

投稿日時 - 2011-10-07 14:24:44

ANo.4

あまり複雑に考えなくても、「1~5の乱数で貼り付け先指定して、そこにデータがあったらやり直し」でいいんじゃないすかね。何回も繰り返せば、いつかは「空いてる場所」のインデックスが出てくるんじゃないかと。

Sub MACRO1()
Dim DAT(5) As Double
Randomize
For I = 1 To 5
DAT(I) = Range("A" & CStr(I)).Value
Next
For I = 1 To 5
Do
J = Application.RoundUp(Rnd * 5, 0)
If Range("B" & CStr(J)) = 0 Then Exit Do
Loop
Range("B" & CStr(J)) = DAT(I)
Next
End Sub

こんな感じで行けるはず。つか、テストしたらイケました。
キモは

Application.RoundUp(Rnd * 5, 0)

だと思います。VBA内では直接端数処理が出来ないので・・・。

投稿日時 - 2011-10-07 14:09:23

ANo.3

これをB1:B5のセル範囲のセルについて、上の行から、繰返さないといけないはず。
Sub test01()
For i = 1 To 5
If Cells(i, "B") = "" Then
Cells(i, "B") = Cells(i, "a")
End If
Next i
End Sub
のような形(あくまで形だけ)。
質問者の例では、B列のセルが空白かと聞いているが、B列B1:B5のセルにに既にデータが入っているケースはありえるのか。
どういう場合か説明して質問のこと。余りないケースと思うが。
また
>A1~A5までのデータをランダムに1つづつ貼り付ける
なんて初心者には難しすぎるよ。ゲームの影響か、ランダムということをよく書く質問があるが、難しい。
理論的にも乱数は理解が難しい。
ランダムはコンピュターの関数でそのままやると、(特に狭い範囲だと)同じ値が出てきてもおかしくない。それで良いのか。
ーー
小数例ではテストしているが、下記は誤りを含んでないか、自信ないが(後出の回答も参考にして)。
Sub test02()
For i = 1 To 5
If Cells(i, "B") = "" Then
p1:
Randomize
x = Int((5 - 1 + 1) * Rnd() + 1)
y = Cells(x, "A")
If WorksheetFunction.CountIf(Range("B1:B5"), y) >= 1 Then
GoTo p1
End If
MsgBox y
Cells(i, "B") = y
End If
Next i
End Sub

投稿日時 - 2011-10-07 13:52:37

ANo.2

1から5と範囲が決まっているので

For ~ Next

を使いましょう。
---
Dim r as Integer
Randomize
For i = 1 to 5
If Range("B" & i).value = "" Then
r = Int(5 * Rand + 1)
Range("B" & i).value = Range("A" & r).value
End
Next i

--
ランダムにというので

r = Int(5 * Rand + 1)

で1から5までの数字をランダムに取得しています。
(ただし重複あり)

投稿日時 - 2011-10-07 13:45:48

あなたにオススメの質問