アプリ版:「スタンプのみでお礼する」機能のリリースについて

実行時エラー1004
Rangeメソッドは失敗しました:_Worksheetオブジェクト
というエラーメッセージが With ws の次の行で出ます。
何が間違っているのか分からないのですが、どう直せばいいのかご教示いただけますでしょうか?

Sub Macro1()

Dim ws As Worksheet
Dim i As Integer
Dim r As Integer

Set ws = ActiveSheet

For i = 4 To 704

With ws
If .Range(.Cells(i, 2)).Value = "前年" Then
.Range(.Cells(i, 3), .Cells(i, 14)).Value = _
.Range(.Cells(i, 3).Offset(1, 0), .Cells(i, 14)).Offset(1, 0).Value
If .Range(.Cells(i, 2)).Value = "今年" Then
.Range(.Cells(i, 3), .Cells(i, 14)).Value = ""
End If


End If


やりたい事は、B列に前年と今年が交互に複数行入っていて、間に空白行が2行入り、また前年と今年が複数行入り、全支店分が続きます。
列はC列~N列まで12か月分のデータが入り、O列に横の合計が入ります。
これを、B列上の前年が見つかれば一つ下の今年のデータを前年にコピペして、(一つ下に)今年が見つかればその行のC~N列のデータを空白行にしたいです。

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

  • tatsumaru77様
    分かりずらく申し訳ありません
    画像の様になっております

    「エラーコード1004」の補足画像1
    No.2の回答に寄せられた補足コメントです。 補足日時:2022/06/09 14:45
  • rabbit_9999様
    B列の変数i行に前年がみつかれば~は具体的にどのような記述になりますか?
    教えていただけますか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/06/09 14:51
  • ご回答ありがとうございます
    i+1で前年の数字が今年に入りました。ありがとうございます。
    また、Rangeを抜くことでエラーが回避されました。ありがとございます。
    ただ、二つ目のifで今年行C~Nを空欄にしたかったのですが、数字が残ったままです。
    何がおかしいのでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/06/09 15:13
  • tatsumaru77様
    具体的なコードの記述ありがとうございます。
    ただ、2つ目のifで空欄になりません。
    何がおかしいのでしょうか?

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/06/09 15:17

A 回答 (6件)

以下のようにしてください。



Sub Macro1()

Dim ws As Worksheet
Dim i As Integer
Dim r As Integer

Set ws = ActiveSheet

For i = 4 To 704

With ws
If .Cells(i, 2).Value = "前年" Then
.Range(.Cells(i, 3), .Cells(i, 14)).Value = _
.Range(.Cells(i + 1, 3), .Cells(i + 1, 14)).Value
If .Cells(i + 1, 2).Value = "今年" Then
.Range(.Cells(i + 1, 3), .Cells(i + 1, 14)).Value = ""
End If
End If

End With
Next
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。
具体的に記述していただいたコードで動きました。
助かりました。ありがとうございます。

お礼日時:2022/06/09 15:28

こんにちは



すでに回答にあるように、「Rangeメソッドは失敗しました」はセル範囲の指定がうまくできていないという意味になります。

補足の図がよく見えないのではっきりとはわからないのですが、想像するところ、こんなことをなさりたいのではないかと・・

If .Cells(i, 2).Value = "前年" Then
 .Cells(i, 3).Resize(, 12).Value = .Cells(i + 1, 3).Resize(, 12).Value
ElseIf .Cells(i, 2).Value = "今年" Then
 .Cells(i, 3).Resize(, 12).ClearContents
End If
    • good
    • 1
この回答へのお礼

助かりました

ありがとうございました。
具体的にコードを記述していただき勉強になりました。
ただ、それより先に具体的にコードを記述していただいた方にベストアンサーとさせていただきました。

お礼日時:2022/06/09 15:27

> B列の変数i行に前年がみつかれば~は具体的にどのような記述になりますか?


> 教えていただけますか?

すでにNo.3さんが回答されてますが、

If .Cells(i, 2).Value = "前年" Then

でOKです。(Rangeは不要。)

気になるところは、ブレークポイント設定してから実行すればそこで一度止まってくれますので、「デバック」-「クイックウォッチ」とか使って、自分が意図した通りの内容を持ってきているか?をチェックしてみると良いですよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。まだ全然勉強中なので、デバックして見てもまだ理解できませんでした。そちらの勉強もこれからいていきたいです。
大変勉強になりましたが、今の私は時間が無かったので具体的にコードを記述していただいた方から選ばせていただきました。

お礼日時:2022/06/09 15:35

.Range でセルを決めなくても、1つのセルなら .Cells(i,2).Value でも良いですよ。


範囲にしたい時は必要ですけど。

あと
.Range(.Cells(i, 3), .Cells(i, 14))

.Range(.Cells(i, 3).Offset(1, 0), .Cells(i, 14)).Offset(1, 0)
これですとセルの個数違いませんか?
上記は変数:i の1行に対し、下記は変数:i + 1 ~ i と2行になってます。
列数は同じですが行数の違いで入りきらないかも。
行をずらしたければ簡単なのは共に行を i + 1 にする事かな?
この回答への補足あり
    • good
    • 0
この回答へのお礼

助かりました

ありがとうございます。
こちらの手違いでご指摘の通りで動きました。

お礼日時:2022/06/09 15:26

>B列に前年と今年が交互に複数行入っていて、間に空白行が2行入り、また前年と今年が複数行入り、全支店分が続きます。



レイアウトは添付の画像のようになっていると理解しました。
そうすると、B列に前年が見つかった場合、3つ下に今年が見つかるのではないでしょうか。1つ下は、空白になると思いますが、いかがでしょうか。
「エラーコード1004」の回答画像2
この回答への補足あり
    • good
    • 0

> If .Range(.Cells(i, 2)).Value = "前年" Then



ここでエラーが出るってことですよね?
このIF文を読む限り、「.Cells(i, 2)」に「A1」とか「C5」とか、セルの位置を指定する文字列が入っている、と読めますが、それが間違ってませんか?
この回答への補足あり
    • good
    • 0

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