Excel VBA質問箱 IV

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

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


10911 / 13646 ツリー ←次へ | 前へ→

【19213】略語リストからの置換(汎用バージョン) momo 04/10/25(月) 18:44 質問[未読]
【19217】Re:略語リストからの置換(汎用バージョン) ちゃっぴ 04/10/25(月) 20:27 回答[未読]
【19232】Re:略語リストからの置換(汎用バージョ... momo 04/10/26(火) 12:06 お礼[未読]

【19213】略語リストからの置換(汎用バージョン)
質問  momo  - 04/10/25(月) 18:44 -

引用なし
パスワード
   19098-123で入力用の略語リストからデータ入力用の
略語を一括置換できないかと相談していたmomoです。

ちゃっぴさんのアドバイスを参考により、マウスで範囲を
指定できるなど初心者に親しみやすく汎用性の高いマクロを作りました。

しかし、置換対象セルが少ないうちはうまく置換してくれるのですが
対象セルが数千個に及ぶと置換してくれません。
私がUBound関数をよく理解できてないからでしょうか?


************************************************

Dim myCell As Range '略語リストの範囲
  Dim myMsg As String, myTitle As String
 
  myMsg = "略語リスト(左列に略語、右列に正式名)を選択して下さい。"
  myTitle = "略語リストの指定"
 
  On Error Resume Next
 
  Set myCell = Application.InputBox(Prompt:=myMsg, Title:=myTitle, Type:=8)
 
  If myCell Is Nothing Then Exit Sub


 Dim myCell2 As Range '置換範囲
 Dim myMsg2 As String, myTitle2 As String
 
  myMsg2 = "置換範囲を選択して下さい。"
  myTitle2 = "置換範囲の指定"
 
  On Error Resume Next
 
  Set myCell2 = Application.InputBox(Prompt:=myMsg2, Title:=myTitle2, Type:=8)
 
  If myCell2 Is Nothing Then Exit Sub
 
 'Range(myCell2.Address).Select


  Dim vntTarget  As Variant '置換対象範囲の中のデータ
  Dim vntList   As Variant '略語リストの中の略語
  Dim i As Long, j As Long


  '略語リストを配列に格納
  vntList = Range(myCell.Address).Value
 
  '置換対象文字列を配列に格納
  vntTarget = Range(myCell2.Address).Value
 
  '置換処理
  For i = 1 To UBound(vntTarget)
    For j = 1 To UBound(vntList)
      vntTarget(i, 1) = Replace$(vntTarget(i, 1), _
        vntList(j, 1), vntList(j, 2), 1, -1, 0)
    Next j
  Next i
 
  '置換した配列を一括出力
  Range(myCell2.Address).Value = vntTarget
  Set rngTarget = Nothing

End Sub

【19217】Re:略語リストからの置換(汎用バージョ...
回答  ちゃっぴ  - 04/10/25(月) 20:27 -

引用なし
パスワード
   こんばんわ、ちゃっぴです。

>しかし、置換対象セルが少ないうちはうまく置換してくれるのですが
>対象セルが数千個に及ぶと置換してくれません。
>私がUBound関数をよく理解できてないからでしょうか?

UBound関数というより、配列まだちょっと理解されていないようですね。

>  '置換対象文字列を配列に格納
>  vntTarget = Range(myCell2.Address).Value

InputBoxで対象セル範囲を選択させていると思いますが、
これを配列に取り込むと、行と列とで2次元の配列になります。

>  '置換処理
>  For i = 1 To UBound(vntTarget)
>    For j = 1 To UBound(vntList)
>      vntTarget(i, 1) = Replace$(vntTarget(i, 1), _
>        vntList(j, 1), vntList(j, 2), 1, -1, 0)
>    Next j
>  Next i

前回では、対象列が1列でしたので、列に対してはループさせていません。
もう、お分かりでしょう?

列に対してもループしてやればいいです。

なお、
>  '置換した配列を一括出力
>  Range(myCell2.Address).Value = vntTarget

これは非常に無駄な記述ですね。myCell2自体がRangeオブジェクトなので

myCell2.Value = vntTarget

とシンプルにしてやりましょう。

【19232】Re:略語リストからの置換(汎用バージョ...
お礼  momo  - 04/10/26(火) 12:06 -

引用なし
パスワード
   ▼ちゃっぴ さん:
おはようございます。

いつも丁寧なアドバイスありがとうございます。m(_ _)m


アドバイスどおり列に関してもループさせてうまくいきました。

さらに汎用性を高めるのには、現在は同じワークシート内に
略語リスト、置換対象データ、がないと動かないので
別シートに略語リストがあっても動くようにしたいですね。

ちょっと汎用性というより趣味的ですが。


:::::::ちなみに変更したところは::::::::::::::::::::::::::::::::::::::::

  Dim vntTarget  As Variant '置換対象範囲の中のデータ
  Dim vntList   As Variant '略語リストの中の略語
  Dim Targetcolumn As Long  '置換対象の列数を数える
  Dim i As Long, j As Long, k As Long


  '略語リストを配列に格納
  vntList = Range(myCell).Value
 
  '置換対象文字列を配列に格納
  vntTarget = Range(myCell2).Value
 
  Targetcolumn = myCell2.Columns.Count '置換対象の列数を数える

  '置換処理
  For k = 1 To Targetcolumn
   For i = 1 To UBound(vntTarget)
     For j = 1 To UBound(vntList)
       vntTarget(i, k) = Replace$(vntTarget(i, k), _
         vntList(j, 1), vntList(j, 2), 1, -1, 0)
     Next j
   Next i
  Next k

  '置換した配列を一括出力
  Range(myCell2).Value = vntTarget
  Set rngTarget = Nothing

End Sub

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