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

こんにちは

VBAを使って式を組んだのですが
エラーになってしまいます。

やりたいこととしては
A列に関数、B列に文字などが入っていて
B列は最下部まで入力が住んでいるのですが
A列は途中までしか関数が入っていません。
最上部からオートフィルを使うと
列が長いため動きが遅くなってしまいます。
なのでA列の最下部から3行上に戻って
そこからオートフィルで式をB列と同じ行の位置まで
反映がしたいです。


組んだ式は以下になります。
→がついている文がエラーとなっており
実行時のエラー '1004':
Range クラスの AutoFill メゾットが失敗しましたという文が出てきます。
この文がおかしいのはわかるのですが
直し方がわかりません。。

お力をお貸しいただけますと幸いです。
何卒宜しくお願いいたします。



Sub Macro5()
'
' Macro5 Macro
'
'
n = Cells(Rows.Count, "A").End(xlUp).Row - 3
Range("A" & n).Select
→ Selection.AutoFill Destination:=Range("A2:A" & Cells(3).CurrentRegion.Rows.Count)
Range("A2:A" & Cells(3).CurrentRegion.Rows.Count).Select


End Sub

質問者からの補足コメント

  • うーん・・・

    ご回答頂きましてありがとうございます。

    「3」という数字に意味はありません。
    ただ、A列B列最上部からオートフィルを使うと
    多くの数値が入るため動きが遅くなってしまいます。

    今回は軽量化のために、
    できるだけ選択範囲を少なくしたいと考え、
    「3つ上から」という数字を提示しました。

      補足日時:2018/04/03 13:35
  • うれしい

    tom04さん

    ご回答ありがとうございます。
    A列に使用したところ一番早く動きました!
    ありがとうございます。

    これを他のセルにも適用したいと考え
    N列最下部から上に向かって遡り
    O:Y列の数式が入っているセル以降~O:Y列の最終行(N列最終行)まで
    適用できるようにしたいのですが
    このコードの下にコードをつなげるには
    どの様に改変したらよいでしょうか。

    何度もすみません。
    宜しくお願い致します。

    No.3の回答に寄せられた補足コメントです。 補足日時:2018/04/05 11:26

A 回答 (5件)

>N列最下部から上に向かって・・・



二つのマクロをまとめてみました。

Sub Sample3()
Dim i As Long, lastRow As Long, myRow As Long
Dim myRng As Range
'//最初の処理//
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
For i = lastRow To 2 Step -1
If Cells(i, "A").HasFormula Then
myRow = i
Exit For
End If
Next i
Range(Cells(myRow, "A"), Cells(lastRow, "A")).Formula = Cells(myRow, "A").Formula
'//N列以降の処理//
lastRow = Cells(Rows.Count, "N").End(xlUp).Row
For i = lastRow To 2 Step -1
If Cells(i, "O").HasFormula Then
myRow = i
Exit For
End If
Next i
Set myRng = Range(Cells(myRow, "O"), Cells(myRow, "Y"))
Range(Cells(myRow, "O"), Cells(lastRow, "Y")).Formula = myRng.Formula
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

無事に使えました!!
お忙しいところどうもありがとうございます。

他のセルで引用する場合は
lastRow = Cells(Rows.Count, "N").End(xlUp).Row
For i = lastRow To 2 Step -1
If Cells(i, "O").HasFormula Then
myRow = i
Exit For
End If
Next i
Set myRng = Range(Cells(myRow, "O"), Cells(myRow, "Y"))
Range(Cells(myRow, "O"), Cells(lastRow, "Y")).Formula = myRng.Formula
ここのところをどんどん貼り付けていけば使えました!
助かりました(*^^*)

お礼日時:2018/04/05 14:42

こんにちは



横からですが・・・

A列には必ず同じ式が入るものと考えてよいのなら、A列の最終行からB列の最終行までに式を設定すればよいのではないでしょうか?
以下はその考え方によるマクロです。

Sub Sample()
lastB = Cells(Rows.Count, 2).End(xlUp).Row
lastA = Cells(Rows.Count, 1).End(xlUp).Row

If (lastB > lastA) Then
Cells(lastA, 1).Resize(lastB - lastA + 1).Formula = Cells(lastA, 1).Formula
End If
End Sub


ところで、毎回B列に値を入れるたびにマクロを実行するのと、手動で式をオートフィルするのって、ほとんど手間は変わらないと思いますし、毎回処理を行うことそのものが面倒な気がします。
例えば、前もってA列の使いそうな範囲に式を関数式を設定しておくということはできないのでしょうか?
そうすれば、いちいち関数式を継ぎ足してゆく手間どのものがなくなります。

そのままの式を設定すると、エラーになったり間違った値が表示されてしまうなどであれば
 =IF(B1="","",現在の関数式)
のような関数にしておいて、B列に値があれば計算するようにしておくことで、解決しそうな気がするのですが・・・
(実は、こちらの案の方がお薦めなのですが)
    • good
    • 0
この回答へのお礼

A列以外にもあったので今回はマクロ案を採用しました。
ご回答頂きましてありがとうございました。

お礼日時:2018/04/05 14:43

続けてお邪魔します。



>できるだけ選択範囲を少なくしたいと考え・・・

B列データは増えていく可能性がある!というコトで、最小限のオートフィルで済ませたい!というコトですかね?
それでは↓のコードにしてみてください。

Sub Sample2()
Dim i As Long, lastRow As Long, myRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
For i = lastRow To 2 Step -1
If Cells(i, "A").HasFormula Then
myRow = i
Exit For
End If
Next i
Range(Cells(myRow, "A"), Cells(lastRow, "A")).Formula = Cells(myRow, "A").Formula
End Sub

B列最終行から上に向かって遡り、
A列の数式が入っているセル以降~A列の最終行(B列最終行)まで数式を入れるようにしてみました。m(_ _)m
この回答への補足あり
    • good
    • 0

No.1です。



前回のコードではB列最終行の3行前までしか数式が入りません。
コード内の「-3」の部分を消してください。m(_ _)m
    • good
    • 0

こんにちは!



なぜ3行戻って下へフィル&コピーするのか判りません。
単純にA2セルの数式を最終行まで入れてはダメですか?

Sub Sample1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Range(Cells(2, "A"), Cells(lastRow - 3, "A")).Formula = Range("A2").Formula
End Sub

ではどうなりますか?m(_ _)m
    • good
    • 0

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

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