
こんばんは
Excel VBAで 「数式」の貼り付け相当のことを行おうとした際、
pastespecial ではなく代入で実施しようとしましたが思った通りになりませんでした。
修正した結果、とりあえずの目的は達成できたのですが、
・下記コード「A」のFormulaR1C1プロパティで代入される結果がなぜそうなるのかよく分からない
⇒ F5=RC[-5] ならわかる。なぜ=R[1]C[-5]になるのか?
・代入の構文を使用し、一文でPastespecial相当のことをする方法はないか
ご教示願います。
'実験コード-----------------------------------
’A1~A10 に1~10の数字
’B1~G1にはすべて "=A1"
'12~20行目のデータは参考として2~10に実際に入っている数式を
'Formulatext関数を利用して、A1形式、R1C1形式で記載しています。
Sub test()
Range("B2").Formula = Range("B1").Formula
Range("C2:D2").Formula = Range("C1").Formula
Range("B4:B6").Formula = Range("B1").Formula
Range("C4:D6").Formula = Range("C1:D1").Formula
Range("B8:D10").Formula = Range("B1").Formula
'------------------------------------------------------------
Range("E2").FormulaR1C1 = Range("E1").FormulaR1C1
Range("F2:G2").FormulaR1C1 = Range("F1").FormulaR1C1
Range("E4:E6").FormulaR1C1 = Range("E1").FormulaR1C1
Range("F4:G6").FormulaR1C1 = Range("F1:G1").FormulaR1C1 ’---A
Range("E8:G10").FormulaR1C1 = Range("E1").FormulaR1C1
End Sub

No.1ベストアンサー
- 回答日時:
こんばんは。
>⇒ F5=RC[-5] ならわかる。なぜ=R[1]C[-5]になるのか?
>Range("F4:G6").FormulaR1C1 = Range("F1:G1").FormulaR1C1 ’---A
たぶん、Range型で、相対参照になっているから、F1 の位置を平行移動して、F4の位置に見立てて、それぞれのセルの位置関係から、組み直されるというぐらいしか説明できません。
私自身、長く、R1C1型は使ってきたけれども、少なくとも、VBAとしては、一番、敬遠する使い方かもしれません。理屈抜きで、そのような数式の代入は絶対にしないということですね。
VBAは、VBAの一般的な方法で処理していきます。
どういう数式を入れるかにもよりますが、
例えば、
[F4]に、A4のセルの値を出し、[G4]に、B4のセルの値を出す
[F5]に、A5のセルの値を出し、[G5]に、B5のセルの値を出す
ならば、
まず、R1C1方式で考えて、
行は同じだから、R (同じ行という意味)
F4は、 =RC[-5], G4 は、同じ =RC[-5]
だから、数式代入の右辺は、必ずテキスト型の数式になります。
Sub FormulaEnter()
Range("F4:G6").FormulaLocal = "=RC[-5]"
End Sub
となるわけです。なぜ、FormulaLocal を使うかというと、日本固有の表記の混ざる関数などがある可能性があるからです。例えば、元号の年とか。
回答ありがとうございます。
一意の値が代入される場合は問題なかったです。
(質問文 E8:G10 がそれに当たります)
今回は代入元が2種類になる("=RC[-5]", "=RC[-6]")
書き換えてみると
Range("F4:G6").Formula = Array("=RC[-5]", "=RC[-6]")
で、やはり結果は同じで
F5=R[1]C[-5], G5=R[1]C[-6]
でした。(FormulaR1C1でなくても同じ動作なんですね)
持たれているイメージとしては数式=数式の代入は避けたほうが賢明といったところでしょうか。
"Local" についてありがとうございます。
ほかのページ参考にしてもよくわかっていませんでしたが
"元号とか"でなんとなく腑に落ちました。
No.2
- 回答日時:
どうもお返事ありがとうございます。
>持たれているイメージとしては数式=数式の代入は避けたほうが賢明といったところでしょうか。
そうですね。Range... = Range... の数式は、コントロールが効きません。つまり、Range 型に、相対参照式を貼り付けると、貼り付けた場所を起点としてしまうので、ずれてしまいます。例えば、こんなこともありえます。
Sub testRetardCell()
Range("A1").FormulaR1C1 = "=R[-1]C"
End Sub
R1C1型だからありえるものです。中身は、=A1048576 ということです。
その前に、マクロを良く書く人は、このようなオプションをつけます。ショートカットか、クイックアクセスツールバー(QAT)に、以下のようなコードを、個人用マクロブックに置きます。
こうすれば、ボタンはトグルになってくれます。
R1C1<->A1 切り替えボタン
Public Sub RCA1Alternative()
With Excel.Application
If .ReferenceStyle = xlR1C1 Then
.ReferenceStyle = xlA1
Else
.ReferenceStyle = xlR1C1
End If
End With
End Sub
これで、A1 からR1C1方式、R1C1からA1に切り替えながら、数式を作るわけです。
例えば、10万行を、1から順番に番号をつける場合は、
Sub TestRow()
Range("A1:A100000").Formula = "=ROW(RC[+1])"
Range("A1:A100000").Value = Range("A1:A100000").Value
End Sub
>今回は代入元が2種類になる("=RC[-5]", "=RC[-6]")
>書き換えてみると
>Range("F4:G6").Formula = Array("=RC[-5]", "=RC[-6]")
知っている人はやっている可能性あるのですが、アポストロフィ(')をつける方法で、以下のように使います。
Sub FormulaEnter()
Range("F4:G6").Value = Array("'=RC[-5]", "'=RC[-6]")
Range("F4:G6").Value = Range("F4:G6").Value
End Sub
これは、なぜか画面がA1方式でもエラーを出さないようです。
まだまだ、いろんな手法が残されているのかもしれません。
もう一つありますね。
正確なVBAコードは覚えていないけれども、こんな方法です。
VBAでは、Selection を多用するなとはいいますが、唯一の方法です。
数式を串刺しする方法です。選択したシートに全部、同じ数式が入っています。シートをループするのとどちらが便利かは分かりませんが。
Sub ThreeDFormulaEnter()
Worksheets.Select
Worksheets("Sheet1").Activate
Range("A5").Formula = "=A1+5"
Range("A5").Select
Selection = Selection.Formula
Worksheets("Sheet1").Select
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 2 2022/03/28 17:38
- Excel(エクセル) マクロを簡潔にしたい 6 2022/09/16 10:37
- Excel(エクセル) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 3 2022/08/21 20:51
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) 関数を最終行までコピー 3 2022/09/04 11:05
- Excel(エクセル) エクセルで書式設定とフィルタの組み合わせでうまく行かないのですが 4 2022/10/07 10:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
血液検査の結果が悪くefgrの値...
-
風俗店へ行く前のご飯
-
EXCELで式からグラフを描くには?
-
検便についてです。 便は取れた...
-
VLOOKUP関数を使用時、検索する...
-
尿検査前日に自慰行為した時の...
-
納豆食べた後の尿の納豆臭は何故?
-
値が入っているときだけ計算結...
-
勃起する時って痛いんですか? ...
-
2つの数値のうち、数値が小さい...
-
精子が黄色?
-
精子に血が・・・
-
excelでsin二乗のやり方を教え...
-
イタリアから帰国する際、肉製...
-
【Excelで「正弦波」のグラフを...
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
-
ExcelのVBAでフォームが表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
イタリアから帰国する際、肉製...
-
2つの数値のうち、数値が小さい...
-
健否~書類の書き方~
-
VLOOKUP関数を使用時、検索する...
-
値が入っているときだけ計算結...
-
小数点以下を繰り上げたものを...
-
エクセルで空白セルを含む列の...
-
EXCELで条件付き書式で空白セル...
-
リンク先のファイルを開かなく...
-
ある範囲のセルから任意の値を...
-
精子に血が・・・
-
エクセルで数式の答えを数値と...
-
風俗店へ行く前のご飯
-
エクセル指定した範囲からラン...
-
一番多く表示のある値(文字列...
-
Excel 数値の前の「 ' 」を一括...
-
ワードのページ番号をもっと下...
-
MIN関数で空白セルを無視したい...
おすすめ情報