プロが教えるわが家の防犯対策術!

Sub 合計()
With Range("A2", Range("A" & Rows.Count).End(xlUp))
With .Columns(18)
.FormulaR1C1 = "=if(count(rc[-9],rc[-8])=2,rc[-9]*rc[-8],"""")"
.Value = .Value
End With
End With
End Sub

Sub 差引合計()
With Range("A2", Range("A" & Rows.Count).End(xlUp))
With .Columns(8)
.Formula = "=IF(COUNT(F2:G2),SUM($F$1:$F2)-SUM($G$1:$G2),"""")"
.Value = .Value
End With
End With

End Sub

2つのコードがありますが、1つ目のコードを2つ目のように、.Formula 形式?で変換をお願いできないでしょうか?
-9はJ列、-8はK列としてください。
よろしくお願します。

A 回答 (3件)

R1C1参照形式ではない状態(A1形式 列番号がA,B,C・・・になっている状態)にして、


.Value = .Valueの行にブレークポイントを付けて実行すれば、
Columns(18) (R列)に入る数式がA1形式で表示されるので、それをコピーして

.Formula=

に貼り付ければいい。
絶対参照にしたければ、「$」をつける。

やってみると、

=IF(COUNT(I2,J2)=2,I2*J2,"")

の数式になるので、

.Formula="=IF(COUNT(I2,J2)=2,I2*J2,"""")"

.Formula="=IF(COUNT($I$2,$J$2)=2,$I$2*$J$2,"""")"

ということか。
    • good
    • 0

普通VBAの解説書などにはこんな式は載っていません。

余りはやらない、と言うことだと思う。
マクロの記録かな。どこかにこんな書き方載ってましたか。
解読しても良いが、質問には何をしたいか、文章で明記すべきと思う。

前半はA2セルからA列データ最終行までの該当件数を出す式を設定しているの穴
もともと、VBAでは、セルに式をいれるのは邪道で、処理をVBAでして、値をセルにセットすれば良い。
>Columns(18)
R列としたほうがわかりやすい。
>With .Columns(8)
Withはオブジェクトについて、プロパティなど複数諸設定をするとき便利だが
1つの式しか要れないときにこんなのを使うと、コード文字数が増えるだけ。
>rc[-9],
18-9+1=10 J列   +1はRCの[ ]内が隔たりを表すので加えている
>rc[-8])=
18-8+1=11 K列
>rc[-9],rc[-8])=
セル範囲を表す部分だから、は:のミス?
>if(count(rc[-9],rc[-8])=2
意味は、数字が入っているセルが2セルなら
>rc[-9]*rc[-8],"""")"
掛け算をする式を入れて、そうでなければ空白(式を入れない)
>With Range("A2", Range("A" & Rows.Count).End(xlUp))
With .Columns(18)
 前の行のコードは行範囲を指定しているだけ。With .Columns(18)は列ではR列を指定している。
結局A列のデータ行数(セル範囲)だけ、R列における範囲でもでも考えている。
その場合は、Range("R2","R" & d) と書ける。dはA列最終データ行番号。
テスト例
Sub test06()
d = Range("A" & Rows.Count).End(xlUp).Row
MsgBox d
Range("R2:R" & d).FormulaLocal = "=A2"
End Sub
これでR2:R5に、=A2.=A3,=A4・・の式が入った(とりあえず簡略例)。
ーー
上記テストでは=A2にした部分は、質問では
"=if(count(rc[-9],rc[-8])=2,rc[-9]*rc[-8],"""")"
そこで
テスト例で
Sub test07()
d = Range("A" & Rows.Count).End(xlUp).Row
MsgBox d
MsgBox "=IF(COUNT(I2:I" & d & ")=2,J2*K2,"""")"
Range("R2:R" & d).FormulaLocal = "=IF(COUNT(J2:J" & d & ")=2,J2*K2,"""")"
End Sub
ーー
テストデータ
A列
A3=2
A5=5
以下A列は空白セル。
このA5が最下行の5を決定
ーー
J列  K列

32

46

ー52
J2:J5 にある数字データが2セルで条件に合致
その場合
R列にはR2:R5

6

24
でシートの式は、R2は
=IF(COUNT(J2:J5)=2,J2*K2,"")
===
日頃はR1C1を使わず慣れないものだから「面倒なことだ。
    • good
    • 0

>.FormulaR1C1 = "=if(count(rc[-9],rc[-8])=2,rc[-9]*rc[-8],"""")"


「,」ではなく「:」の間違いですね。
.FormulaR1C1 = "=if(count(rc[-9]:rc[-8])=2,rc[-9]*rc[-8],"""")"

以下でためしてください。
.Formula = "=IF(COUNT(J2:K2)=2,J2*K2,"""")"
    • good
    • 0

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