プロが教える店舗&オフィスのセキュリティ対策術

エクセルなのですが、

Sub N文字目を置換する1()
Dim N As Long

Range("a1").Value = "abcde"
N = 2 '置換する文字の位置 ’start(省略不可)

Mid(Range("a1").Value, N) = "X"
MsgBox Range("a1").Value
End Sub

このように、セルを指定することはできないのでしょうか?
このコードを実行しようとすると、
Mid(Range("a1").Value, N) = "X"の部分で「変数が必要です」とコンパイルエラーになります。

Sub N文字目を置換する2()
Dim moji As String
Dim N As Long

Range("a1").Value = "abcde"
moji = Range("a1").Value
N = 2

Mid(moji, N) = "X"
MsgBox moji
End Sub
このように、セルの値を一度変数に入れると問題なく実行できますが、
なぜダイレクトにmidステートメントでセルを指定できないのかわからないので教えてください。

よろしくお願いします。

A 回答 (3件)

こんにちは。



昔は、Midステートメントは使われていたのですが、今は、ほとんどお目に掛かりません。おそらく、右辺から左辺に入れるというスタイルでないので、読みにくいことが原因なのかもしれません。

ヘルプより
このように書かれています。

'//
Mid ステートメント

Mid(stringvar, start[, length]) = string

stringvar 変更する文字列変数の名前を指定します。◎
start  stringvar の中の置き換えを始める位置を文字数単位で指定します。
length 置き換えを行う文字数を指定します。省略すると、文字列すべてが使われます。
string 新しく置き換える文字列式を指定します。
'//

最初のコードで、エラーになるのは、受け皿になる入れ物がないからです。
Range("A1").Valueでは指定した入れ物にはなりません。

'他の同様のサンプル
'//
Sub TestReplace()
Dim moji As String
Dim tmp As String
Const N As Integer = 2
  Range("A1").Value = "abcde"
  moji = Range("A1").Value
  tmp = Mid(moji, N, 1)
  Range("A1").Value = Replace(moji, tmp, "X",1, 1)
End Sub
'//
'こちらはRange("A1")直接でも可能(右辺から左辺に入れるスタイルになっている)
' Range("A1").Value = WorksheetFunction.Replace(Range("A1").Value, 2, 1, "X")
Sub TestFuncReplace()
Dim moji As String
Dim tmp As String
Const N As Integer = 2
  moji = Range("A1").Value
  Range("A1").Value = WorksheetFunction.Replace(moji, N, 1, "X")
End Sub
'//
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/02/17 12:59

エラーメッセージからわかるとおり、Midステートメントの第一引数は、(文字列)変数だけです。


ヘルプを見てもそう書いてあります。
なぜと言われてもそういう言語だからとしか言えない。

Range("a1").Value は変数じゃ無くてプロパティです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/02/17 12:59

VBAは


  Mid(Range("a1").Value, N) = "X" → "aXcde"
とした「あと」に、この文字列をどうしていいのかわからないようです。


VBAは「行同士のつながりは基本的に無い」ですから、
後の行に処理を渡したいなら変数に入れたりして、どこかに格納しないとダメなのです。


後者の場合、変数「moji」に格納したものを書き換えていますので、
(私は初めて見るMidの使い方でしたが)上手くいっているのですね。

前者は、A1セルの値を書き直した後に「何もしていない」のです。
セルに置き換えた後の文字列を入れる命令も無いですね。
変数に格納する構文でもないですね。
普通に考えると、
  Mid(Range("a1").Value, N) = "X"
と与えると「False」を返しますから、VBAにとっては
「いきなり"False"言われても・・・」と言うわけです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/02/17 12:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!