- 締切済み
エクセル、セルの範囲内検索
例えば A1~C50までの範囲内で、 ランダムで1セル選択し、別のエクセルファイルの A100に貼り付け。と言う事は可能なのでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
空ならやり直すようにすれば、良いかと。ただし、範囲内が全て空だと無限 ループの恐怖が(--;) Sub Sample() Dim lngRow As Long, lngCol As Long Dim lngMaxRow As Long, lngMinRow As Long Dim lngMaxCol As Long, lngMinCol As Long Dim tmp As Variant Dim SH As Worksheet '最少行番号 lngMinRow = 1 '最大行番号 lngMaxRow = 50 '最少列番号 lngMinCol = 1 '1=A列 '最大列番号 lngMaxCol = 3 '3=C列 '転記元のシートをオブジェクト変数に Set SH = Workbooks("2.xls").Sheets("Sheet1") GetRandNum: '乱数初期化 Randomize '乱数で取得する行番号を決める lngRow = Int((lngMaxRow - lngMinRow + 1) * Rnd + lngMinRow) '乱数で取得する列番号を決める lngCol = Int((lngMaxCol - lngMinCol + 1) * Rnd + lngMinCol) '値が空でないかをチェック tmp = SH.Cells(lngRow, lngCol).Value If IsEmpty(tmp) Then '空ならやり直し GoTo GetRandNum Else '転記 Workbooks("1.xls").Sheets("Sheet1") _ .Range("A100").Value = tmp End If Set SH = Nothing End Sub
- KenKen_SP
- ベストアンサー率62% (785/1258)
本当に、、申し訳ないです。#1 のコードはよく見たら、バグだらけでした。 任意の範囲で整数の乱数を発生させるには、 Int((最大値 - 最小値 + 1) * Rnd + 最小値) となります。#1 のコードは全然違いますね。うろ覚えの頭の中で書いたもの ですから、お粗末なものをアップしてご迷惑をお掛けしました。 > Workbooks("1.xls").Sheets("Sheet1").Range("A100").Value = _ > Workbooks("2.xls").Sheets("Sheet1").Cells(lngRow, lngCol).Value 元ブックは 2.xls で転記先ブックが 1.xls 、かつシート名が正しければ、コード の記述としては、正しいはずです。 > エラーが出ちゃいます。 恐らく、#1のコードは乱数発生の部分がまずかったので、0 などの数値が返り、 エラーになったのだと思います。例えば、Cells(0,3) などはエラーになります。 重ねて、すみません。 一応バグフィックスしたものを再アップさせて下さい。 Sub Sample() Dim lngRow As Long Dim lngCol As Long Dim lngMaxRow As Long, lngMinRow As Long Dim lngMaxCol As Long, lngMinCol As Long '最少行番号 lngMinRow = 1 '最大行番号 lngMaxRow = 50 '最少列番号 lngMinCol = 1 '1=A列 '最大列番号 lngMaxCol = 3 '3=C列 '乱数初期化 Randomize '乱数で取得する行番号を決める lngRow = Int((lngMaxRow - lngMinRow + 1) * Rnd + lngMinRow) '乱数で取得する列番号を決める lngCol = Int((lngMaxCol - lngMinCol + 1) * Rnd + lngMinCol) '転記。両方のブックが開いてる必要があります Workbooks("1.xls").Sheets("Sheet1").Range("A100").Value = _ Workbooks("2.xls").Sheets("Sheet1").Cells(lngRow, lngCol).Value End Sub
お礼
大変ありがとうございます。 バッチリできました^^ありがとうございます。 追加で聞きたいことあるのですが、 範囲内の中に空白がある場合、 空白を除く検索は可能でしょうか?
- mu2011
- ベストアンサー率38% (1910/4994)
以下の方法は如何でしょうか。 =OFFSET([book.xls]Sheet1!$A$1,RANDBETWEEN(0,9),RANDBETWEEN(0,2)) (注)両エクセルファイルが開いていないとエラーになります。
- KenKen_SP
- ベストアンサー率62% (785/1258)
#1 です。すみません、コードを3ヵ所訂正させて下さい。 【訂正前】 Dim lngMaxRow As Long, lngMixRow As Long ^^^^^^^^^ Dim lngMaxCol As Long, lngMixCol As Long ^^^^^^^^^ '乱数で取得する列番号を決める lngRow = Int((lngMaxCol - lngMincol + 1) * Rnd + lngMaxCol) ^^^ 【訂正後】 Dim lngMaxRow As Long, lngMinRow As Long Dim lngMaxCol As Long, lngMinCol As Long '乱数で取得する列番号を決める lngCol = Int((lngMaxCol - lngMinCol + 1) * Rnd + lngMaxCol) Excel で動作するか検証してませんので、、すみません。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 > ランダムで1セル選択し、別のエクセルファイルのA100に貼り付け... ご質問タイトルとは全く別件ではないかと。。(^^;) Sub Sample() Dim lngRow As Long Dim lngCol As Long Dim lngMaxRow As Long, lngMixRow As Long Dim lngMaxCol As Long, lngMixCol As Long '最少行番号 lngMinRow = 1 '最大行番号 lngMaxRow = 50 '最少列番号 lngMincol = 1 '1=A列 '最大列番号 lngMaxCol = 3 '3=C列 '乱数初期化 Rndomize '乱数で取得する行番号を決める lngRow = Int((lngMaxRow - lngMinRow + 1) * Rnd + lngMaxRow) '乱数で取得する列番号を決める lngRow = Int((lngMaxCol - lngMincol + 1) * Rnd + lngMaxCol) '転記。両方のブックが開いてる必要があります Workbooks("転記先ブック名").Sheets("転記先シート名").Range("A100").Value = _ Workbooks("元ブック名").Sheets("元シート名").Cells(lngRow, lngCol).Value End Sub
お礼
乱数初期化のaがぬけてて定義エラーがでてました^^; なんとかコンパイルして実行したのですが、 転記のところで両方のブックがひらいているのに、 エラーが出ちゃいます。転記先ブックやシート 元ブック(実行ブック)と元シートの書き方が間違えているのでしょうか? Workbooks("1.xls").Sheets("Sheet1").Range("A100").Value = _ Workbooks("2.xls").Sheets("Sheet1").Cells(lngRow, lngCol).Value でよろしいのでしょうか?
お礼
無事に目的とした表が完成致しました! ありがとうございましたー!