エクセル VBA の質問です。A1の値に犬,A2に猫,A3に狸がはいっています。t = Range("A1:A3").Value2 としたときに、

1番目の犬を見て、変換かけて元に戻すのはどうしたらいいでしょうか? たとえば、犬はdog に 猫はcat と翻訳して、tの中身を変更したいのです。 

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/11/15 13:58:12
  • 終了:2009/11/22 14:00:20

回答(2件)

id:SALINGER No.1

SALINGER回答回数3430ベストアンサー獲得回数9692009/11/15 14:49:24

ポイント35pt

セルを直接操作さずに変数を変更するということですね。

tは2次元配列となるので次でよろしいかと。

Sub test()
    Dim t As Variant
    Dim i As Integer
    t = Range("A1:A3").Value2
    
    For i = 1 To UBound(t)
        Select Case t(i, 1)
            Case "犬"
                t(i, 1) = "dog"
            Case "猫"
                t(i, 1) = "cat"
            Case "狸"
                t(i, 1) = "tanuki"
        End Select
    Next i
    
    'テスト
    For i = 1 To UBound(t)
        Debug.Print t(i, 1)
    Next i
End Sub

http://q.hatena.ne.jp/

id:kaiketsu

試してみます。! ありがとうございました。

2009/11/15 14:56:32
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/11/15 15:27:31

ポイント35pt

例1:条件分岐:データ増減によってプログラム改変&動作テストという手間が発生

Sub Macro1()
    Dim t As Range, v As Variant
    Set t = Range("A1:A3")
    For Each v In t
        v.Value2 = fun1(v.Value2)
    Next v
End Sub

Function fun1(v As Variant) As Variant
    Select Case v
    Case "犬"
        fun1 = "dog"
    Case "猫"
        fun1 = "cat"
    Case "狸"
        fun1 = "racoon"
    Case Else
        fun1 = v
    End Select
End Function

例2:連想配列:コードが見やすくなる分、上記よりは少しマシなだけ

Sub Macro2()
    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    d.Add "犬", "dog"
    d.Add "猫", "cat"
    d.Add "狸", "racoon"

    Dim t As Variant, v As Variant
    t = Range("A1:A3").Value2
    For Each v In t
        v = d(v)
        Debug.Print v
    Next v
End Sub

例3:Excelワークシート関数:データの増減に自動対応、ネイティブ動作のため処理も高速

Sub Macro3()
    Dim t As Variant, v As Variant
    t = Range("A1:A3").Value2
    For Each v In t
        v = WorksheetFunction.VLookup(v, Range("Sheet2!A1:B" & Worksheets("Sheet2").Range("a65535").End(xlUp).Row), 2, False)
        Debug.Print v
    Next v
End Sub

Sheet2 に以下のようにデータを入れてます。

A B
1 dog
2 cat
3 racoon

http://q.hatena.ne.jp/dummy

  • id:kn1967
    変換用のデータはどこにおくの?
    (1)同じブック内の別のシート?
    (2)別のブック内のシート?
    (3)プログラムの中?
    (4)別途テキストファイルとか?
    (5)ネット上の翻訳サイト? これはちょこちょこっと回答できる程度では済まないな。
    ・・・・はてさて
  • id:kaiketsu
    value でデータに変換されるのでスクリプトの中で、t の中身を入れ替えたいのです。
  • id:kaiketsu
    value でなくて、value2 でした。。。

    t が variant 型になっていますが、この中身を読んで変換したいということなんです。
  • id:kn1967
    (1)置き場所が重要
    単語を変換するルーチンを作って、あとはデータの数だけループすれば良いだけなのですが、
    肝心の変換ルーチンの部分は、入れ替えるためのdogやcatなどのデータが、
    どこに置かれているのかによって、大きく変わってくるので、データをどこに置くかをお聞きしてます。

    プログラム中に置いてというのは非常に効率悪い方式なので、
    Excelを使うなら別のシートに変換一覧を作っておくというのが処理効率高いのですが・・・。


    (2)セルに書き戻すのか、戻さないのかも重要
    >tの中身を変更したい
    ここで終わらせてしまうと、変数の中身を変えるだけで、セルの内容は変わりません。
    変更したtの中身をセルに反映させますか?
  • id:kaiketsu
    セルの中身は変更しなくていいです。スクリプト内で完結でいいです。そんなに劇的に効率が悪いのでしょうか?
  • id:kn1967
    プログラム中で行うベタな例ですが、こんなのを求めておられるのではないでしょ?

    Sub Macro1()
    Dim t As Range, v As Variant
    Set t = Range("A1:A3")
    For Each v In t
    v.Value2 = fun1(v.Value2)
    Next v
    End Sub

    Function fun1(v As Variant) As Variant
    Select Case v
    Case "犬"
    fun1 = "dog"
    Case "猫"
    fun1 = "cat"
    Case "狸"
    fun1 = "racoon"
    Case Else
    fun1 = v
    End Select
    End Function

    ※ExcelVBAには連想配列的なものありません。
    ディクショナリってのを呼び出して使うという手を使ったり、
    シート状にデータを配してサーチするなりという手を使うと便利です。
  • id:kn1967
    プログラム中ということで、一応、ディクショナリを使った例もあげておきます。

    Sub Macro2()
    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    d.Add "犬", "dog"
    d.Add "猫", "cat"
    d.Add "狸", "racoon"

    Dim t As Variant, v As Variant
    t = Range("A1:A3").Value2
    For Each v In t
    v = d(v)
    Debug.Print v
    Next v
    End Sub

    これらのコード・・・回答欄に書くべきだったかな?
  • id:kn1967
    コメント欄って軽視されやすいのかしら・・・?

    上記2例にワークシート関数を使った例を加えて回答のほうに書き直しましたので、よければ参照ください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません