エクセルなのですが、
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ステートメントでセルを指定できないのかわからないので教えてください。
よろしくお願いします。
No.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
'//
No.2
- 回答日時:
エラーメッセージからわかるとおり、Midステートメントの第一引数は、(文字列)変数だけです。
ヘルプを見てもそう書いてあります。
なぜと言われてもそういう言語だからとしか言えない。
Range("a1").Value は変数じゃ無くてプロパティです。
No.1
- 回答日時:
VBAは
Mid(Range("a1").Value, N) = "X" → "aXcde"
とした「あと」に、この文字列をどうしていいのかわからないようです。
VBAは「行同士のつながりは基本的に無い」ですから、
後の行に処理を渡したいなら変数に入れたりして、どこかに格納しないとダメなのです。
後者の場合、変数「moji」に格納したものを書き換えていますので、
(私は初めて見るMidの使い方でしたが)上手くいっているのですね。
前者は、A1セルの値を書き直した後に「何もしていない」のです。
セルに置き換えた後の文字列を入れる命令も無いですね。
変数に格納する構文でもないですね。
普通に考えると、
Mid(Range("a1").Value, N) = "X"
と与えると「False」を返しますから、VBAにとっては
「いきなり"False"言われても・・・」と言うわけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) vba userformで漢字を全角カタカナに 2 2022/07/24 15:38
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelについて教えてください
-
【Excel】数字を3倍にし、なお...
-
エクセルVBA、別ブックへ転記す...
-
エクセル マクロ チェックボックス
-
Excel分析ツールでのポアソン回...
-
【マクロ】顧客番号にて一致さ...
-
【マクロ】名前を保存する際に...
-
エクセルのデーターが2か月前の...
-
UNIQUE関数が使えないバージョ...
-
エクセル共有したが、アクセス...
-
Excelでセルの値が同じか...
-
(マクロ)データをAブックからB...
-
Excel フィルターを掛けた状態...
-
エクセル②
-
エクセルを使っていて2024/5/15...
-
Googleスプレッドシートでファ...
-
エクセルで不等号記号(≠)が上に...
-
Win10でExcel VBA GetPhonetic...
-
Excelで縦軸の書式を0:00形式の...
-
エクセル:一覧表に存在する文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT関数 エラーになる
-
midステートメント セルを指定...
-
PowerPointの表内のカンマ
-
【VBA】PDF出力に任意のファイ...
-
EXCELでタイトル行と一番下の行...
-
LINEのこの空白ってどんな意味...
-
エクセルの計算式でコンマを付...
-
エクセルでleft関数の結果が表...
-
Excelのテーブル上のセルの保護...
-
名簿の漢字名を関数で半角カナ...
-
Wordの差し込み印刷で空白行が...
-
EXCEL 連動したドロップダウン...
-
エクセルでハイパーリンクのコピー
-
エクセルでセル内改行の1行目...
-
16桁以上の「0」に変換されてし...
-
エクセルで「-3E+06」と...
-
エクセル関数:文字だけでなく...
-
EXCELで縦の行全てに一括して文...
-
【エクセル】入力規則のプルダ...
-
エクセル 印刷範囲外を非表示...
おすすめ情報