Excel97のマクロでAutoFillを使おうとしているのですが、エラーが出て実行できません。

何も表示されていないシートでコマンドボタンを押すと、AutoFillを使ってA1セル~E1セルとA2セル~E2セルに数字の1~5が表示されるようにしたいと考えています。

下記のようにマクロを書いたところ、A1~E5はうまくできたのですが、
「Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries」
の行でエラーが発生します。
「実行時エラー:1004 RangeクラスのAutoFillメソッドが失敗しました。」と表示されます。


Private Sub CommandButton1_Click()

  ActiveSheet.Range("A1").Select
  ActiveCell.FormulaR1C1 = "1"
  Selection.AutoFill Destination:=ActiveCell.Range("A1:E1"), Type:=xlFillSeries

  ActiveSheet.Range("A2").Select
  ActiveCell.FormulaR1C1 = "1"
  Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries

End Sub


どなたかエラーの原因を教えていただけないでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんばんは。



>どなたかエラーの原因を教えていただけないでしょうか?

難しいことなのですね。教本には、載っていないですね。

まず、基本的なことなのですが、コントロールツールのCommandButton は、シート属性を持ったものなのですね。ですから、記録マクロを、そのままペタンと貼り付けてもうまくいかないことが多いです。

エラーは2番目のSelection で出ているはずです。

Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries

ActiveCell.Range("A2:E2")
というのは、ActiveCellが、Range("A2")ですと、相対参照になっていますから、A4:E4 ということになってしまいます。元の値がありませんので、エラーが出ます。

それを、第一弾目に直したものです。

 Range("A1").Select
 Selection.Value = "1"
 Selection.AutoFill Destination:=Range("A1:E1"), Type:=xlFillSeries

 Range("A2").Select
 Selection.Value = "1"
 Selection.AutoFill Destination:=Range("A2:E2"), Type:=xlFillSeries

それを直しますと、以下のようになります。
通常、文字列で入れても、ワークシートでは、文字列が数値に変換されています。ワークシートの状況が見えていませんので、一応、数値にしておきます。
'------------------------------------------------------
 Range("A1").Value = 1
 Range("A1").AutoFill Destination:=Range("A1:E1"), Type:=xlFillSeries

 Range("A2").Value = 1
 Range("A2").AutoFill Destination:=Range("A2:E2"), Type:=xlFillSeries
'------------------------------------------------------

もう少し、マクロに慣れてくるとこのようになります。
ただし、書式が文字列になっている場合は、この方法が出来ません。

With Range("A1:E2")
   .FormulaLocal = "=Column(RC)"
   .Value = .Value
End With
    • good
    • 1
この回答へのお礼

大変よく分かりました。
ありがとうございました。

お礼日時:2006/01/25 09:38

ActiveSheet.Range("A1").Select


ActiveCell.FormulaR1C1 = "1"
Selection.AutoFill Destination:=Range("A1:E1"), Type:=xlFillSeries

ActiveSheet.Range("A2").Select
ActiveCell.FormulaR1C1 = "1"
Selection.AutoFill Destination:=Range("A2:E2"), Type:=xlFillSeries
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2006/01/25 09:39

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRange("AQ" & TR).Formula =の右辺に書く式を教えてください

よろしくお願いします
いつもgooの皆さんには大変お世話になっております
お陰様で全く知識ゼロだったマクロが少しですが書けるようになりました
エクセルも大分わかってきました
win8.1でエクセルは2013です

式の中身です(日本語表示)
もしも、AN42の値が1で、なおかつ、M42とO42とAO42とAP42の値がすべて同じなら1
そうでなければ0

教えていただきたい事
上記の内容の式を
Range("AQ" & TR).Formula =
の右側に書くにはどう書いたらよいでしょうか?
TRは行番号で42です

以上です
うまく説明できなくて迷惑をかけるかもしれませんが
よろしくお願いします

Aベストアンサー

当方、初心者のくせにメッセージ失礼いたします。

セルAQ42にコチラの関数を入れました。
=IF(AND(AN42=1,M42=O42,O42=AP42),1,0)

こちらをVBAに直すとこうなりました。
"=IF(AND(RC[-3]=1,RC[-30]=RC[-28],RC[-28]=RC[-1]),1,0)"

マクロに詳しい方ならもっと綺麗なVBAを記載してくださるかと思います。。。

QExcelでの表編集でC1に =IF(A1="",B1,A1)

Excelでの表編集でC1に =IF(A1="",B1,A1)
と以前文字データのある列A1、B1、2つからそれぞれ穴あき
を補いc1に表示する式=IF(A1="",B1,A1)を教えていただいたのですが
2列まではこの式で行けるのですが3列以上に対応させる記述が
分かりません。
3列以上の表示を一列にまとめる式を教えてください。
お願いします。

Aベストアンサー

条件が良く判りませんが?

セルB1が空白のとき、セルC1をセルD1に表示
という条件を追加すると
=IF(A1="",IF(B1="",C1,B1),A1)

こんな感じですが、イメージと違う場合は補足してください。

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

QRange("BI" & TR).Formula = に続く式の書き方を教えてください

よろしくお願いします。いつもgooの皆さんには大変お世話になっております
win8.1でエクセルは2013です

Private Sub Worksheet_Change(ByVal Target As Range)内のマクロです

マクロでセルに式を書き込みたいのですがエラーになってしまいます
一度使った書き方はメモを見てすぐかけるのですが
初めてのスタイルだと書けません
&でつなげるのに規則がありますが、頭で整理できていません

TRはTarget.Rowのことで宣言済みです
Dim TR As Long
TR = Target.Row

書きたいのは
BKのTRからBTのTRまでの合計を求めてエラーならERRと表示する
です
以下をどう直せばよいでしょうか?
教えてください

Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR )",""ERR"")"

Aベストアンサー

こんばんは。

Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR )",""ERR"")"
   ↓
Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR & "),""ERR"")"

後ろのTRの後の「 & "」 が抜けているようです。

本格的なマクロするなら、数式を入れるのではなくて、SUMの値を変数に入れたほうがよいですね。
その値は、Variant 型にしておけば、エラー値も取れますから、エラーになったら、ERRの文字を代入すれば、Formula で数式を入れる必要はありませんね。

Qエクセルで、=IF(A12="a",TRUE)は =A1="a"  ???

エクセルで、
=IF(A12="a",TRUE)

=A1="a"
と省略できるのですか?

やってみるとまったく同じようなのですが、いまいち不安です。

また、=IF(D4=TRUE,"OK!","No!")も、日頃=IF(D4,"OK!","No!")と略してますが、これも正しいんですよね?
気になったものですから確認させてください。

Aベストアンサー

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽の場合も、

=IF(条件式,真の場合,)

と、引数区切りのカンマだけ付けると、空欄と見なされて(省略とは異なる)数値の「0」を返します。

次に、条件式についてですが、
条件式は、

「左辺」+「比較演算子」+「右辺」

の書式になっているものを指します。
ここで、比較演算子とは、
「=、>、<、>=、<=、<>」
を指します。
条件式は、成立/不成立の結果、TRUE/FALSEという論理値を返します。
つまり、

=A1="a"

は、条件式の戻り値そのものを表示していることになります。
それに対して、IF関数の方は、条件式を判定した結果、真の場合と偽の場合をそれぞれ実行して表示しています。
その真の場合と偽の場合が、条件式の戻り値とちょうど一致しているということです。

さて、IF関数の第1引数は、通常は上記の条件式を指定しますが、実際はIF関数は第1引数を数値として判断しています。
その判定基準は、第1引数が、
0 → 偽の場合を実行
0以外 → 真の場合を実行
となります。
そして、第1引数が条件式の場合に限り、戻り値の論理値を、
TRUE → 1
FALSE → 0
と数値に変換して判定しているのです。
これが、質問欄の後半の2つの数式の挙動の違いの原因なのです。

=IF(D4=TRUE,"OK!","No!")

は、第1引数は「D4=TRUE」という条件式です。
この場合、戻り値は必ずTRUE/FALSE(=1/0)です。
(ただし、D4にエラーが入っている場合を除く)
一方、

=IF(D4,"OK!","No!")

の方は、第1引数は「D4」で、これはセルD4の値そのものです。
で、前述のように、IF関数は第1引数を数値として判定するので、このD4が数値(と論理値)以外の場合(文字列など)はエラーになります。
D4が数値(と論理値)の場合は、前述のように、「0」かそれ以外かで判定され、真/偽の場合のいづれかを実行して表示します。

このIF関数の第1引数が数値として判定されているということを利用した例が以下のようなものです。
例えば、A列に数値が1つでもあれば"OK"、1つもなければ(つまり0)"NG"を表示する場合、意味を考えれば、

=IF(COUNT(A:A)>0,"OK","NG")

ですが、これを、

=IF(COUNT(A:A),"OK","NG")

と、A列の数値の個数(COUNT関数の戻り値)そのもので判定することが出来るわけです。

以上、長くなりましたが、補足説明でした。

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報