- ベストアンサー
エクセル、コマンドボタンについて
素人な質問ですみません。 シート1にコマンドボタンを作成しています。 このコマンドボタンを押すと、シート2のA1セルからE10セルに入力してある50の文字列から、ランダムにコマンドボタンのあるシート1のA1セルに表示させるようにしたいのですが。 このようなことは出きるでしょうか? VBAの知識もほとんどなく困ってます。 簡単に言うと、コマンドボタンを使って、別シートに入力してある文字列を表示させる方法ということになるでしょうか。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、とにかくできればいいと言うのであれば、 Sub ボタン1_Click() Randomize Sheets(1).Cells(1, 1).Value = Sheets(2).Cells(Int(Rnd * 10 + 1), Int(Rnd * 5 + 1)).Value End Sub こんなかんじでしょうか 役に立ちますように。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
セルを配列に入れなくても、セル範囲は配列の扱いになります。 Private Sub CommandButton1_Click() Randomize R = Int(50 * Rnd + 1) MsgBox R Worksheets("sheet3").Range("A1:E10")(R).Copy ActiveSheet.Range("a1").Select ActiveSheet.Paste End Sub 私の場合Sheet2にコマンドボタンを貼り付け、Sheet3のA1:E10に値と書式設定してテストしました。Sheet2をアクチブにして(コマンドボタンをクリックするからそうなるでしょう)実行してください。 Msgboxは確認のためです。はずしてください。 >の書式のまま受け継ぎたい。 表示幅のことならば、AutoFitメソッドを入れてください。 標準モジュールに入れること。 Sub test03() Worksheets("Sheet2").Columns("A").AutoFit End Sub
お礼
同時書き込みになってしまいましたね。 わざわざご丁寧に回答いただき、ありがとうございます。 当方解決しましたが、参考にさせてもらいます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >表示させるセル(シート1)の書式を、 >引用もとのセル(シート2)の書式のまま受け継ぎたいのですが。 >※ランダムに表示させる文字列によって、 > 文字数等が違いセルに入りきらないため。 文字数が入らないために、書式をコピーするというのは、良く分りませんね。セル幅を変えるのでしたら、以下のようにすればよいのですが、かなりうっとうしいような気がします。セル幅を、文字列の文字数の最大値に設定してしまったほうがいいように思いますが。そのようなセル幅調整がいらないのでしたら、** ~** の間を削除してください。 Dim myData(1 To 50) Dim k As Integer, c As Variant, t As Integer k = 1 For Each c In Worksheets("Sheet2").Range("A1:E10") myData(k) = c.Value k = k + 1 Next c Randomize ' 乱数発生ルーチンを初期化します。 t = Int(50 * Rnd + 1) With Worksheets("Sheet1") .Range("A1").Value = myData(t) '** 'セル幅を文字数に合わせるが、設定以下には狭めない。 If Len(.Range("A1").Value) > .StandardWidth Then .Range("A1").EntireColumn.AutoFit 'セル幅を整える Else .Range("A1").EntireColumn.ColumnWidth = .StandardWidth End If '** End With '// コピーするなら、以下のようにする方法もあります。 セル幅は変更されません。データと書式のみです。 コマンドボタンの中身 Dim myData(1 To 50), rng As Range Dim k As Integer, c As Variant, t As Integer Set rng = Worksheets("Sheet2").Range("A1:E10") k = 1 Randomize ' 乱数発生ルーチンを初期化します。 t = Int(50 * Rnd + 1) rng.Cells(t).Copy Worksheets("Sheet1").Range("A1") Set rng = Nothing
お礼
とても詳しいご回答、本当にありがとうございます。 なんとか自分のやりたいことが出来ました。 お二人ともありがとうございました。 また質問することがあるかもしれませんが、 これからもよろしくお願いします。
- shkwta
- ベストアンサー率52% (966/1825)
形式をコピーする場合は、このような方法があります。 Sheet2.Cells(Int(Rnd() * 10) + 1, Int(Rnd() * 5) + 1).Copy これは、手操作での「コピー」と同じです。続いて、 Sheet1.Cells(1,1).PasteSpecial xlPasteAll とすれば、セルの中身が形式つきで貼り付けられます。ただし、列幅は貼り付かないので、列幅も貼り付けたい場合はさらに Sheet1.Cells(1,1).PastSpecial xlPasteColumnWidths とします。ここで出てきたPasteSpecialメソッドは、手操作での「形式を指定して貼り付け」に相当します。指定できる形式はいろいろあるので、詳しくはヘルプをご覧ください。 このあと、セルにつく「動く点線」が気になる場合は、 Application.CutCopyMode = False で消します。
お礼
ようやく思い通りのものを作ることが出来ました。 くだらない言葉遊びゲームを作るだけでしたが、 とても参考、勉強になりました。 ありがとうございました。
- shkwta
- ベストアンサー率52% (966/1825)
コマンドボタンのコードに Sheet1.Cells(1,1) = Sheet2.Cells(Int(Rnd() * 10) + 1, Int(Rnd() * 5) + 1) と書くのでどうでしょう。
お礼
大変参考になりました。ありがとうございました。 無事思い通りの動きが再現できました。 なお、厚かましく質問なのですが、 表示させるセル(シート1)の書式を、 引用もとのセル(シート2)の書式のまま受け継ぎたいのですが。 ※ランダムに表示させる文字列によって、 文字数等が違いセルに入りきらないため。 そのようなことはできるのでしょうか?
補足
さっそくのご回答ありがとうございます。 試してみたかったのですが、コマンドボックスを作成すると ファイルの保存ができなくなることに気づきました。 こちらを新しく質問させていただき、解決したらもう一度shkwta様の ご回答どおり試してみたいと思います。
お礼
大変役に立ちました。 ありがとうございました。 なお、下でももう一度質問させていただいたのですが、 こちらでも厚かましく質問させて下さい。 表示させるセル(シート1)の書式を、 引用もとのセル(シート2)の書式のまま受け継ぎたいのですが。 ※ランダムに表示させる文字列によって、 文字数等が違いセルに入りきらないため。 そのようなことはできるのでしょうか?
補足
ANo1の補足に書いたとおりです。 さっそくのご回答ありがとうございました。