[[20171226114907]] 『末尾を8に変換するマクロのエラー』(Erika) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『末尾を8に変換するマクロのエラー』(Erika)

マクロ初心者です。

以下の内容で、なぜか1文だけ赤字でエラーが出てしまいます。
構文エラーだそうです。

 Range("G2:G" & Lastlow).Formula = "=SUBSTITUTE(F2,RIGHT(F2,1),"8")"

エラーの原因はなんでしょうか。

以下全文です。

Sub 末尾8変換()
'
' 末尾8変換 Macro
'
' Keyboard Shortcut: Ctrl+Y
'

    Columns("G").Insert
    Columns("G").Select
    Selection.NumberFormatLocal = "G/標準"

    '最終行を取得
     Lastlow = Cells(Rows.Count, 2).End(xlUp).Row

    'G列の末尾を8に変換するための数式貼付け
     Range("G2:G" & Lastlow).Formula = "=SUBSTITUTE(F2,RIGHT(F2,1),"8")"

    'F列のLCCDを式→数値
    Range("F2:F" & Lastlow).Value = Range("F2:F" & Lastlow).Value

    Range("F1").Select
    Application.CutCopyMode = False
    Selection.Cut

    Range("G1").Select
    ActiveSheet.Paste

    Columns("F:F").Select
    Selection.Delete Shift:=xlToLeft

End Sub

よろしくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 "8" を ""8"" に変更
  Range("G2:G" & Lastlow).Formula = "=SUBSTITUTE(F2,RIGHT(F2,1),""8"")"

(seiya) 2017/12/26(火) 12:10


 SUBSTITUTE関数だと例えばAABAが88B8になってしまう。
 Range("G2:G5").Formula = "=IFERROR(LEFT(F2,LEN(F2)-1)&""8"","""")"
 ではどうか。
(ねむねむ) 2017/12/26(火) 12:34

 質問内容には関係ない回答ですが、数式を貼り付け後に値貼り付けをしているようなので

 Sub test()

     Dim LastRow As Long, i As Long

     LastRow = Cells(Rows.Count, 2).End(xlUp).Row
     For i = 2 To LastRow
         Cells(i, "F").Value = Application.Replace(Cells(i, "F"), Len(Cells(i, "F")), 1, 8)
     Next

 End Sub

 みたいな感じでもいいかもしれません。
(bi) 2017/12/26(火) 13:52

 biさん、範囲内に空白セルがある場合の対策もしておいた方がいいのでは?
 (途中に空白セルがあってもエラーにならないようにSUBSTITITE関数使ったのではと想像)
(ねむねむ) 2017/12/26(火) 14:02

 >範囲内に空白セルがある場合の対策もしておいた方がいいのでは?

 その通りですね。失礼しました。

 Sub test()

     Dim LastRow As Long, i As Long

     LastRow = Cells(Rows.Count, 2).End(xlUp).Row
     For i = 2 To LastRow
         If Cells(i, "F").Value <> "" Then Cells(i, "F").Value = Application.Replace(Cells(i, "F"), Len(Cells(i, "F")), 1, 8)
     Next

 End Sub
(bi) 2017/12/26(火) 14:33

 Erikaさん

 一連の 挿入 数式挿入 値貼り付け 削除は

 Sub test()
     [f2:f10000] = [if(len(f2:f10000),left(f2:f10000,len(f2:f10000)-1)&"8","")]
 End Sub

 で事足りると思いますが?
(seiya) 2017/12/26(火) 14:50

皆様、ご回答頂き、ありがとうございました。
いろいろな方法があるのですね。。。

>ねむねむさん

 ”SUBSTITUTE関数だと例えばAABAが88B8になってしまう。”
との事ですが、 Range("G2:G" & Lastlow).Formula = "=SUBSTITUTE(F2,RIGHT(F2,1),""8"")"
これでF2セルの右から1文字目、という設定になっていると思うのですが、
上記のように変換されてしまうことはありますか?

>biさん

値貼り付けのマクロのようですが、私が貼った前文にあるものとなにか結果的に違いはありますか?(○○の場合でもマクロが作動するなど)
ちなみに、途中で空白があることはないデータファイルで使用するマクロを作成しています。

>seiyaさん

この一連のマクロをこの1行でできるということですか?!
初心者なので、何が何だかさっぱりわからないので、よければ説明していただけますでしょうか。

(Erika) 2017/12/27(水) 16:11


 F列の末尾の数値を直接書き換えているだけで結果的には違いはありません。
 ちなみにですが

 'G列の末尾を8に変換するための数式貼付け
 ↓  
 'F列の末尾を8に変換するための数式貼付け

 'F列のLCCDを式→数値
  Range("F2:F" & Lastlow).Value = Range("F2:F" & Lastlow).Value
 ↓
 'G列のLCCDを式→数値
  Range("G2:G" & Lastlow).Value = Range("G2:G" & Lastlow).Value

 ではないですか?勘違いでしたらすみません。
(bi) 2017/12/27(水) 16:49

 F列の文字列/数値の末尾を8に変換するために
 1)G列に列を挿入(作業列)して数式を挿入する
 2)G列の結果を値貼り付けでF列を更新する
 3)用済みのG列を削除

 ということですよね?

 EvaluateメソッドでF列のデータをメモリ内で数式を使用して処理した結果でF列を更新しています。
[[20070212134849]] 『Evaluate Method の研究』(seiya)
 
 ループ処理をする方が一般的でしょう。
 例
 Dim r As Range
 For Each r in Range("f2", Range("f" & Rows.Count).End(xlUp))
     If r.Value <> "" Then
         r.Value = Left$(r.Value,Len(r.Value) - 1) & "8"
     End If
 Next
 とか...
(seiya) 2017/12/27(水) 17:26

 SUBSTITUTE関数は
 SUBSTITUTE(文字列, 検索文字列, 置換文字列, [置換対象])
 という構文で置換対象を指定しない限り文字列内の検索文字列をすべて置換文字列に置き換えてしまう。
 なので文字列内に最終文字列と同じ文字があればそれをすべて8に置き換える。
 (試せばすぐにわかることだが)
(ねむねむ) 2018/01/04(木) 10:12

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.