現在、指定した数分の文字をランダムに置換するプログラムを作成したいと考えています。
プログラムを実行したいエクセルの状況ですが以下になります。
http://oskuni7.sakura.ne.jp/hatena/question8/question.htm
★行いたい処理の流れは以下になります。
プログラムを実行するとダイアログボックスが出てきて、変更したい文字数を入力してくださいの画面が出てきます。
その後、置換したい文字数を入力し、OKボタンを押すと指定した数字分の文字をランダムに変更してくれます。
エクセルのURLでは ああ と書かれてある文字を えええ に指定した分だけ変更するようになっています。
上記の流れの処理のプログラムを組める方おりましたら、お手数をおかけしますがよろしくお願いいたします。
http://oskuni7.sakura.ne.jp/hatena/question8/question.htm ダミーです。
Sub test() Randomize Const SrcWord As String = "ああ" Const DstWord As String = "えええ" Dim MyBook As Workbook Dim TargetSheet As Worksheet Dim TargetRange As Range Dim FindCell As Range Dim FindCells As New Collection Dim RepCount As Long Dim RndNums() As Long Dim RndNum As Long Dim i As Long Set MyBook = ThisWorkbook Set TargetSheet = Sheets("Sheet1") Set TargetRange = TargetSheet.Range(Range("AH1"), Range("AH65536").End(xlUp)) RepCount = InputBox("何個のデータを変更しますか?") ' 置換する対象の文字列を取得 Set FindCell = TargetRange.Find(SrcWord, , xlValue, xlWhole, xlByRows, xlNext, True) If Not FindCell Is Nothing Then FindCells.Add Item:=FindCell, key:=FindCell.Address End If Do While True Set FindCell = TargetRange.FindNext(FindCell) If FindCell Is Nothing Then Exit Do End If If FindCells(1).Address = FindCell.Address Then Exit Do End If FindCells.Add Item:=FindCell, key:=FindCell.Address Loop If FindCells.Count < RepCount Then MsgBox "データ数が少ない" End If ' 乱数のテーブルを作る ReDim RndNums(FindCells.Count) For i = 0 To FindCells.Count RndNum = Int((FindCells.Count + 1) * Rnd) RndNums(i) = RndNum RndNums(RndNum) = i Next i ' 指定された分だけ値を書き換える For i = 0 To RepCount - 1 FindCells(RndNums(i)).Value = DstWord Next i End Sub
このような処理でいかがでしょうか。
URLはダミーです。
横から失礼します。
s-n-kさんの回答にあるスクリプトで、
「インデックスが有効範囲にありません」
というエラーが出るということは、
Excelのバージョンの違いが原因かもしれません。
下記の部分を修正されれば解消するのではないでしょうか。
Set FindCell = TargetRange.Find(SrcWord, , xlValue, xlWhole, xlByRows, xlNext, True)
↓
Set FindCell = TargetRange.Find(SrcWord, , xlValues, xlWhole, xlByRows, xlNext, True)
aiomock さん、無事動いたようでよかったです。中途半端なサンプルを提供してしまい申し訳ございません。