Excel VBA質問箱 IV

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

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


10928 / 13644 ツリー ←次へ | 前へ→

【19098】略語リストから一括置換 momo 04/10/21(木) 15:37 質問[未読]
【19100】Re:略語リストから一括置換 つん 04/10/21(木) 16:11 発言[未読]
【19111】Re:略語リストから一括置換 momo 04/10/21(木) 22:26 質問[未読]
【19117】Re:略語リストから一括置換 つん 04/10/21(木) 23:48 回答[未読]
【19118】Re:略語リストから一括置換 ちゃっぴ 04/10/22(金) 1:09 発言[未読]
【19121】Re:略語リストから一括置換 つん 04/10/22(金) 9:43 発言[未読]
【19123】Re:略語リストから一括置換 momo 04/10/22(金) 11:44 お礼[未読]

【19098】略語リストから一括置換
質問  momo  - 04/10/21(木) 15:37 -

引用なし
パスワード
   データ入力用の略語リストを用いて正式名への
一括置換をしようと試みましたが置換部分で“型が一致しません”
とエラーが出てしまいます。

書いたマクロの説明をしますと、
列方向に並んだデータの先頭セルをアクティブにし、
A列にある略語を取得しB列にある正式名に置換しようとしてます。

どうしたらよいのでしょうか?
___________________________________________
Dim 変換対象 As String
変換対象 = columCounter & ":" & columCounter

Range("A2,A2").Activate

Do Until ActiveCell.Value = ""
 Range("A1").Select
 Dim 略語 As String
 略語 = Range("A1").Value
 Dim 正式名 As String
 正式名 = Range("B1").Value
 Columns(変換対象).Select '変換対象の範囲を指定して略語を正式名に置換
 Selection.Replace What:="略語", Replacement:="正式名", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False

Loop

End Sub

【19100】Re:略語リストから一括置換
発言  つん E-MAIL  - 04/10/21(木) 16:11 -

引用なし
パスワード
   こんにちは。

えーっと、momoさんの書かれたコードを拝見しますと、
ちょっとよくわからない部分や気になる部分が多々あるようです。

まず、「略語」「正式名」は変数ですよね?
変数は「””」で囲むといけません。
「略語」という文字列そのものになってしまいます。

それから、変数の宣言をループの中ではあまりするものじゃないと思います。
通常はプロシージャの先頭でまとめて宣言します。
途中で宣言するという人の話も聞いたことあるような気もしますが、
少なくともループ無いではないと思います。

>Dim 変換対象 As String
>変換対象 = columCounter & ":" & columCounter
「:」の右も左も同じですよね?だったら、
変換対象 = columCounter だけでいいような気も
>
>Range("A2,A2").Activate
ここも、A2をアクティブにするなら、
Range("A2").Activate でいいんでは?

>Do Until ActiveCell.Value = ""
アクティブセルって「A2」ですよね?
ループないで、A2の値が空白になる処理がないみたいなので、
このループは必要ないんじゃないですか?

> Range("A1").Select
>  Dim 略語 As String
>  略語 = Range("A1").Value
>  Dim 正式名 As String
>  正式名 = Range("B1").Value
>  Columns(変換対象).Select '変換対象の範囲を指定して略語を正式名に置換
>  Selection.Replace What:="略語", Replacement:="正式名", LookAt:=xlPart, _
> SearchOrder:=xlByRows, MatchCase:=False
>
>Loop
>
>End Sub

気になることを少々書きましたが、全体的には、イマイチどの範囲のデータをどう処理しようとしてるのかわからないです・・・

【19111】Re:略語リストから一括置換
質問  momo  - 04/10/21(木) 22:26 -

引用なし
パスワード
   つんさま

切り貼りしたので変な書き方をしてました。すいません。

やりたいことは、F列にある略語で入力されたデータを
A列とB列に並んだ略語対応表から正式名称に置換です。

 A  B     ...  F    F
 y 焼肉定食  ...  y    焼肉定食
 o 親子丼   ...  o を  親子丼   に置換したいです。 
 g  牛丼   ...  o    親子丼
 .   .     ...  g    牛丼
 .   .    ...  y    焼肉定食

アドバイスを参考にしつつ下記のように書き直しました。

ただ新たに問題が発生しました。
columns(変換対象列範囲).Select '変換対象の範囲を指定して略語を正式名に置換
↑のところでcolumnsのところをRowsにするとちゃんとその“行”が
置換されます。でもcolumnsだとエラーが出てしまいます。

また、
 Dim 変換対象列範囲 As String
 変換対象列範囲 = 変換対象列 & ":" & 変換対象列
↑この部分変数を設定せず
columns(変換対象列:変換対象列).Select
としてもコンパイルエラーになりました。
columnsをrowsに変えてもコンパイルエラーでした。
変数“変換対象列範囲”と同じ表記方法だと思うのですが。


**************************************************
Dim 変換対象列 As String
 変換対象列 = ActiveCell.Column
Dim 略語リスト As Integer
 略語リスト = 1

Dim 変換対象列範囲 As String
 変換対象列範囲 = 変換対象列 & ":" & 変換対象列

Cells(1, "I").Value = 変換対象列
Cells(2, "I").Value = 変換対象列範囲
Dim i As Integer
 i = 2

Do Until Cells(i, 略語リスト).Value = ""
   Dim 略語 As String
   略語 = Cells(i, 略語リスト).Value
   Dim 正式名 As String
   正式名 = Cells(i, 略語リスト + 1).Value
   columns(変換対象列範囲).Select   '変換対象の範囲を指定して略語を正式名に置換
     Selection.Replace What:=略語, Replacement:=正式名, LookAt:=xlPart, _
     SearchOrder:=xlByRows, MatchCase:=False
   i = i + 1
Loop

End Sub

【19117】Re:略語リストから一括置換
回答  つん  - 04/10/21(木) 23:48 -

引用なし
パスワード
   こんばんは。
今、エクセルの入ってないPCからなので、
ちゃんと調べられませんが(ヘルプがないと(^^ゞ )


>columns(変換対象列範囲).Select '変換対象の範囲を指定して略語を正式名に置換
>↑のところでcolumnsのところをRowsにするとちゃんとその“行”が
>置換されます。でもcolumnsだとエラーが出てしまいます。

あー、行の指定はRows("1:1")で1行目を指定ですが、
列の場合同じように書くなら、Columns("A:A")でA列を指定です。
数字で指定するなら、Columns(1)で、A列が指定できると思いますが・・・

>Cells(1, "I").Value = 変換対象列
>Cells(2, "I").Value = 変換対象列範囲

↑ここの書き方変じゃないですか?
Cells(1,2) あるいは Range("A1") のような書き方しかできないと思いますが・・

それから、変数の宣言ですが、どうしてもループ内でしないとだめな理由でもあるんですか?

また、明日会社に行ってもう一度みてみますね。
それまでに解決してなければ・・・

【19118】Re:略語リストから一括置換
発言  ちゃっぴ  - 04/10/22(金) 1:09 -

引用なし
パスワード
   Replaceメソッドは置換Listの数が多くなると、
それに比例して遅くなるので・・・

置換List数が多いほど、Replace関数を使用したほうが
速くなります。
こういうことをする場合には、全てのデータを一度
配列に入れてから処理すると劇的に速くなります。

Sub test()
  Dim rngTarget  As Range
  Dim vntTarget  As Variant
  Dim vntList   As Variant
  Dim i As Long, j As Long
  
  '置換リストを配列に格納
  vntList = Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Value
  
  Set rngTarget = Range(Cells(1, 6), Cells(65536, 6).End(xlUp))
  '置換対象文字列を配列に格納
  vntTarget = rngTarget.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
  
  '置換した配列を一括出力
  rngTarget.Value = vntTarget
  Set rngTarget = Nothing
End Sub

完全一致であれば、Replace関数も使わなくてよくなりますので、
更なる高速化が望めます。

【19121】Re:略語リストから一括置換
発言  つん E-MAIL  - 04/10/22(金) 9:43 -

引用なし
パスワード
   おはようございます。
ちゃっぴさんがよりよりコードを提示してくださっていますが、
一応、momoさんのやり方を修正してみました。
これで当方では動いているようです。

Sub test()

  Dim 変換対象列 As Integer ’string型だとエラーになるのでIntergerで
  Dim 略語リスト As Integer
  Dim 変換対象列範囲 As String
  Dim 略語 As String
  Dim 正式名 As String
  Dim i As Integer  
 
   変換対象列 = ActiveCell.Column
   略語リスト = 1

  'Columns(数値)の形の方が良いと思いますので
  ’以下の一文は必要ないです。
  '以下の形でしようとおもったら、「ActiveCell.Column」で取得した
  ’数値から、対応するアルファベットを割り出さないとダメなんだと思います。 
  '''' 変換対象列範囲 = 変換対象列 & ":" & 変換対象列

  'この↓行は何をしているのかわからないけど、必要ないのでは?
  '''Cells(1, "I").Value = 変換対象列
  '''Cells(2, "I").Value = 変換対象列範囲

  i = 1
  
  Do Until Cells(i, 略語リスト).Value = ""
    
     略語 = Cells(i, 略語リスト).Value
     正式名 = Cells(i, 略語リスト + 1).Value
     ’↓Selectしなくても直接出来ます。
     Columns(変換対象列).Replace What:=略語, Replacement:=正式名, LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False
     i = i + 1
  Loop

End Sub

ところで、「Cells(1, "I").Value」みたいな書き方あるんですね。
MsgBox Cells(2, "I").Address
ってしたら、ちゃんと「$I$2」が返ってきました(^^;

【19123】Re:略語リストから一括置換
お礼  momo  - 04/10/22(金) 11:44 -

引用なし
パスワード
   おはようございます。
つん さんにアドバイスを頂いたところを訂正し無事動きました。
ありがとうございました。
作業はできたので次は勉強のためちゃっぴさんに教えて頂いた方法を
試そうと思います。


ちなみに下記の行は変数がどのように表記されるのかを
確かめるために入れていたのを消去し忘れていました。
お騒がせしました。

>  'この↓行は何をしているのかわからないけど、必要ないのでは?
>  '''Cells(1, "I").Value = 変換対象列
>  '''Cells(2, "I").Value = 変換対象列範囲

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