- ベストアンサー
Excel2007のマクロでセルのデータを別な記号に変える方法は?
- Excel2007のマクロで、セルK29からZ29までのデータを1つずつ取得し、別な記号に変えてK30からZ30までのセルに入れたい。
- 関数を使って、データに対応した記号を入れる方法を試したが、うまくいかなかった。どこが間違っているのか教えてほしい。
- 質問内容は、Excel2007のマクロでセルのデータを別の記号に変える方法についてです。関数を使って試してみましたが、なぜかズレてしまいます。どこが間違っているのか教えてください。
- みんなの回答 (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等)で処理する場合でも考え方を誤ると同様な結果になりますので注意してください。
その他の回答 (6)
- imogasi
- ベストアンサー率27% (4737/17069)
(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・・の文字コードの何番目の文字かを割り出すのに使えるから。
お礼
imogasiさん、熱の入った説明をありがとうございました。
- watabe007
- ベストアンサー率62% (476/760)
>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
お礼
お礼遅れました。WATABE007さんありがとうございます。
- watabe007
- ベストアンサー率62% (476/760)
>お尻の方の数字ってどのようにして決める物なんですか? ,アイウエ ,アイエウ ,アウイエ ,アウエイ ,を含めて5文字づつ有りますね、なのでFINDで得た数字を5で割って 1を足して補正しています。
お礼
お礼します。
- mt2015
- ベストアンサー率49% (258/524)
- watabe007
- ベストアンサー率62% (476/760)
=IF(Z29="","",MID("ABCDEFGHIJKLMNO",FIND(","&Z29&",",",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,")/5+1,1))
お礼
watabe007さん、いつもありがとうございます。お尻の方の数字ってどのようにして決める物なんですか?
- watabe007
- ベストアンサー率62% (476/760)
=IF(K29="","",MID("ABCDEFGHIJKLMNO",INT(FIND(","&K29&",",",アイウエ,アイエウ,アウイエ,アウエイ,アエイウ,イアウエ,イアエウ,イウアエ,イウエア,イエアウ,イエウア,ウアイエ,ウアエイ,ウイアエ,ウイエア,")/5+1),1))
お礼
bunjiiさん、ありがとうございました。