2010年09月07日

[VBA]VBA実行結果が意図しない形となってしまう(一括置換)。

[VBA]文字列の(複数)一括置換 2010年07月14日

VBAから、エクセル置換機能を利用して一括置換する方法を、上記日付で紹介しました。
コードを流用した方より、意図しない結果となり、原因が分からないと、コメントがありました。

その方が行った変換ルール。
[VBA]VBA実行結果が意図しない形となってしまう(一括置換)。
■ 658を上記パターンで変換を行った場合
658→変換A表 予想される結果:feh
変換A表→変換B表 予想される結果:769
実際に変換された値:711111111

解決方法を結論からいうと、A表、B表の変換文字 e を別の文字へ 
たとえば、k などへ置き換えてあげるだけで、予想どおりの結果となります。

元の状態でも求めたい値とは異なりますが、変換ルールどおりに
変換は行われています。
どうしてそのようになるかを、検証をしてみましょう。

[前提条件]
A1セルへ658を入力します。

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

Option Explicit

Sub 文字列置換()

  Range("A:A").Select
  
  'ループカウンタ
  Dim i As Integer
  
  Dim arrStr(2, 19) As String
  arrStr(0, 0) = "1"
  arrStr(1, 0) = "a"
  arrStr(0, 1) = "2"
  arrStr(1, 1) = "b"
  arrStr(0, 2) = "3"
  arrStr(1, 2) = "c"
  arrStr(0, 3) = "4"
  arrStr(1, 3) = "d"
  arrStr(0, 4) = "5"
  arrStr(1, 4) = "e"
  arrStr(0, 5) = "6"
  arrStr(1, 5) = "f"
  arrStr(0, 6) = "7"
  arrStr(1, 6) = "g"
  arrStr(0, 7) = "8"
  arrStr(1, 7) = "h"
  arrStr(0, 8) = "9"
  arrStr(1, 8) = "i"
  arrStr(0, 9) = "0"
  arrStr(1, 9) = "j"
  arrStr(0, 10) = "a"
  arrStr(1, 10) = "2"
  arrStr(0, 11) = "b"
  arrStr(1, 11) = "3"
  arrStr(0, 12) = "c"
  arrStr(1, 12) = "4"
  arrStr(0, 13) = "d"
  arrStr(1, 13) = "5"
  arrStr(0, 14) = "e"
  arrStr(1, 14) = "6"
  arrStr(0, 15) = "f"
  arrStr(1, 15) = "7"
  arrStr(0, 16) = "g"
  arrStr(1, 16) = "8"
  arrStr(0, 17) = "h"
  arrStr(1, 17) = "9"
  arrStr(0, 18) = "i"
  arrStr(1, 18) = "0"
  arrStr(0, 19) = "j"
  arrStr(1, 19) = "1"
  
  For i = 0 To UBound(arrStr, 2)
    Debug.Print ("変換パターン:" & CStr(arrStr(0, i)) & "→" & CStr(arrStr(1, i)))
    Selection.Replace What:=arrStr(0, i), Replacement:=arrStr(1, i), _
    LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
    Debug.Print ("変換後:" & Selection.Range("A1:A1").Value)
  Next i

End Sub

******************************
[サンプルの実行の仕方]
1.上記の *** で囲まれた内容をコピペし、エクセルマクロ(モジュール)へ
  貼り付けます。
2.マクロ又は、Visual Basic Editer で実行を行ってください。
3.イミディエイトウインドへ実行結果が表示されます。

[実行結果]
変換パターン:1→a
変換後:658
 ***中略***
変換パターン:5→e
変換後:600000000 ※6e8 指数入力で 600000000となります。
変換パターン:6→f
変換後:f00000000
 ***中略***
変換パターン:0→j
変換後:fjjjjjjjj
 ***中略***
変換パターン:f→7
変換後:7jjjjjjjj
 ***中略***
変換パターン:j→1
変換後:711111111

上記変換により、658の置き換え結果が、7.11E+08(711111111)となります。

意図しない動作が発生した時は、ブレークポイントなどで処理を中断し、
原因の調査を行い、該当箇所の修正を行います。

バグは、実行時エラーとなるため、実行時エラーとなった箇所から
遡る事で原因の特定を行いやすいです。
そして、原因の特定ができたら、セル入力値のチェックや、VBAにて
例外処理を追加する事で対処する事ができます。

事前考慮もれ(今回は、エクセルの入力ルール)などで、意図しない動作と
なる時は、処理の流れを追い意図しない値となる部分を特定し、
原因を取り除きます。

[関連]
VBA イミディエイトウインド google検索
VBA Debug.Print google検索
VBA ウォッチウィンドウ google検索
VBA ステップ実行 google検索
VBA ブレークポイント google検索

人気ブログランキングへ人気ブログランキングへ 記事が参考となりましたら。ブログランキングバナーのクリックをお願いします。




[てぃーだブログ広告]

同じカテゴリー(VB・VBA関連)の記事

上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 3人
QRコード
QRCODE