• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで質問ですが何処が間違ってますか?)

Excel2007のマクロでセルのデータを別な記号に変える方法は?

このQ&Aのポイント
  • Excel2007のマクロで、セルK29からZ29までのデータを1つずつ取得し、別な記号に変えてK30からZ30までのセルに入れたい。
  • 関数を使って、データに対応した記号を入れる方法を試したが、うまくいかなかった。どこが間違っているのか教えてほしい。
  • 質問内容は、Excel2007のマクロでセルのデータを別の記号に変える方法についてです。関数を使って試してみましたが、なぜかズレてしまいます。どこが間違っているのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.7

>関数でこの様に書きましたがなぜかズレていました。 >何処が間違ってるか教えてください。 FIND関数での文字位置の計算方法に誤りがあります。 検索対象の文字列が「,アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,」で検査値の値の先頭に「,」を付加していますのでFIND関数の戻り値は1、6、11、・・・・のように5文字間隔になるはずです。しかし、提示の数式では4で除算して0.75を加算するような論理に合わない計算をしていますので誤差が生じてしまいます。 FIND関数の戻り値から1を減じて5で除算し端数を切り捨てた値に1を加えれば正しい位置になるはずです。 FIND(","&K29&",",",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,")/4+0.75      ↓ INT((FIND(","&K29,",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア")-1)/5)+1 または INT((FIND(K29,"アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア")-1)/5)+1 提示の数式はタイプミスが起こり易いので別の方法にされた方が良いでしょう。 尚、マクロ(VBA等)で処理する場合でも考え方を誤ると同様な結果になりますので注意してください。

961awaawa
質問者

お礼

bunjiiさん、ありがとうございました。

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

(1)このタイプの問題はVLOOKUP関数のFALSE型を勉強するほうが良い (2)元データがあって、その右隣列に結果を出すのが常識。    質問では直下行に出している。 エクセルの本など読み、世の中のエクセルの標準というものを学ぶことを勧める。 初心者じゃないかと思うが、むつかしいやり方を考えて、質問していると思う。 ーー VLOOKUP関数FALSE型利用例。 D、E、F列 D2:F16に下記データを作る。 アイウエ 1 A アイエウ 2 B アウイエ 3 C アウエイ 4 D アエイウ 5 E イアウエ 6 F イアエウ 7 G イウアエ 8 H イウエア 9 I イエアウ 10 J イエウア 11 K ウアイエ 12 L ウアエイ 13 M ウイアエ 14 N ウイエア 15 O ーー A列にデータ A2:C5 アイウエ A アウイエ C イアウエ F ウイエア O B2の式は =CHAR(64+VLOOKUP(A2,$D$2:$E$16,2,FALSE)) 本質部分を見失わないように、見つからない時のエラー対応は式に入れてない。 または、F列にA,B,C・・を入れるなら =VLOOKUP(A2,$D$2:F$16,3) ーー VBAでは A1セルに、テーブル的データ アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア, A2:B5 B列は下記VBA実行結果 アイウエ  A アウイエ   C イアウエ  F ウイエア   O ーーー 標準モジュールに Sub test01() 'MsgBox Range("A1") For i = 2 To 5 'MsgBox Cells(i, "A") p = InStr(Range("A1"), Cells(i, "A")) MsgBox p Cells(i, "B") = Chr(64 + Int(p / 5) + 1) Next i End Sub ーー Chr(64 + Int(p / 5) + 1)の部分で、文字コードの知識を使っている。 突然出てくる、64は何かわかりますか。 5で割っているのは、原データ4文字とカンマ1文字の5文字で、規則性があるから。A,B,C・・の文字コードの何番目の文字かを割り出すのに使えるから。

961awaawa
質問者

お礼

imogasiさん、熱の入った説明をありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

>Excel2007のマクロで マクロなら Sub Test()   Dim c As Range, myArr As Variant, n As Long   myArr = Array("アイウエ", "アイエウ", "アウイエ", "アウエイ", "アエイウ", _     "イアウエ", "イアエウ", "イウアエ", "イウエア", "イエアウ", _     "イエウア", "ウアイエ", "ウアエイ", "ウイアエ", "ウイエア")   For Each c In Range("K29:Z29")     n = Application.Match(c.Value, myArr, 0)     c.Offset(1).Value = Chr(64 + n)   Next End Sub

961awaawa
質問者

お礼

お礼遅れました。WATABE007さんありがとうございます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>お尻の方の数字ってどのようにして決める物なんですか? ,アイウエ ,アイエウ ,アウイエ ,アウエイ ,を含めて5文字づつ有りますね、なのでFINDで得た数字を5で割って 1を足して補正しています。

961awaawa
質問者

お礼

お礼します。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

質問文中にはマクロでやりたいような事が書いてありますが、関数で良いのですよね? パッと見て解りにくい式を使うより、対応表を作り(添付の図ではK32:L46)、Vlookup関数を使った方が良いと思います。 添付の図の例ではK30に以下の式を入れています。 =IFERROR(VLOOKUP(K29,$K$32:$L$46,2,FALSE),"")

961awaawa
質問者

お礼

mt2015さんお早うございます。丁寧にしてくださってありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

=IF(Z29="","",MID("ABCDEFGHIJKLMNO",FIND(","&Z29&",",",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,")/5+1,1))

961awaawa
質問者

お礼

watabe007さん、いつもありがとうございます。お尻の方の数字ってどのようにして決める物なんですか?

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

=IF(K29="","",MID("ABCDEFGHIJKLMNO",INT(FIND(","&K29&",",",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,")/5+1),1))

関連するQ&A