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

いつもご尽力いただきまして、ありがとうございます。

連投になりますが、なぜ?エラーになるのか、、、
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value
これならエラーなしで動くのですが、
これを
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
もしくは、
t = Worksheets("間隔").Cells(lastrow - 1, j).Offset(-1,0)
として、
.Cells(13, j).Value = n + t
とするとエラーになります。
-1、もしくはOffset(-1,0)
に問題があるようで、、これを取り除くと動きますし、プラス値なら動きます。。

原因がわからず、一応そのまま式にすると動くのですが、なぜだろうかと、、前にも同じような感じになって、結局そのまま代入式作らずに使ったことがあり、よろしければ、連投ですが、原因を教えていただければと思います。


Private Sub Worksheet_Change(ByVal Target As Range)

Const maxcolumn = 39
Dim j As Long
Dim n As Long
Dim t As Long
Dim lastrow As Long

With Worksheets("計算表")

For j = 2 To maxcolumn
lastrow = Worksheets("間隔").Cells(Rows.Count, j).End(xlUp).Row
n = Worksheets("間隔").Cells(lastrow, j).Value

If lastrow > 1 Then
.Cells(12, j).Value = n

If lastrow >= 3 Then
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value

End If
End If

Next j

End With
End Sub

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

  • うーん・・・

    t = Worksheets("間隔").Cells(lastrow - 1, j).Value
    t = Worksheets("間隔").Cells(lastrow , j).offset(-1)
    で、アプリケーション定義またはオブジェクト定義のエラーです
    となりますが、特に何をしたわけでもないので、、
    If lastrow >= 3 Then
    .Cells(12, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j)
    そのままだと動くのですが、、同じことしてるはずなのに、どうしてかいまだにわからない、という状況です。

      補足日時:2020/10/22 20:14
  • 今回もご回答くださり、ありがとうございました。
    回答がつかなくなるかもしれないというご意見もございましたので、
    今後は質問を控えるよういいたします。

      補足日時:2020/10/23 00:11

A 回答 (7件)

原因を探るには現象を把握する必要があるのでは?



lastrow にいったいどんな数値が入っている時に起こるのか?
それはなぜそうなるのか?

コードを提示されるより実際のSheetで確かめるのがわかりやすいかと。
そしてデバッグにより変数の値の調べ方を知るべきです。

https://excel-ubara.com/excelvba1/EXCELVBA490.html

とか。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。
最新の回答に返信させていただいております。

お礼日時:2020/10/22 19:35

こんにちは


度々ご質問を拝見しますが、デバッグに関するご質問の場合、
どこでエラーになり、どのようなエラーになるのかを示さなければ、
いけないと思います。
更に出来れば、デバッグの検証結果などを加えるべきです。

t = は、どこに入るのですか?これ大事だけど、、、
もっとも、If lastrow > 1 Then 内であっても If lastrow >= 3 Then内であってもエラーになる可能性がありますね。

t = Worksheets("間隔").Cells(lastrow - 1, j).Offset(-1,0)の場合
If lastrow > 1 Thenの条件下なら、
lastrowが3の時、エラー13 (ラベルが文字列の場合)
該当セルの値が文字列ならlastrowの値に関係なく エラー13
lastrowが2の時、1004エラー

少しずれますが、
n = Worksheets("間隔").Cells(lastrow, j).Value
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
t = Worksheets("間隔").Cells(lastrow - 1, j).Offset(-1,0)
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value
示されているプロシージャの場合、上記はすべてエラーになる可能性があります。これは理解できますか?

.Cells(13, j).Value = n + t に関しては各変数に代入する段階でエラーが返るので問題ないように思います。

各セルにはどのような値が入っているのでしょう?
Cells(lastrow - 1, j).Offset(-1,0)が示すセルアドレスはどこでしょう。

*エラー該当位置やエラー№などが不明で且つt =の挿入位置も分かりませんので、見切りで頓珍漢な回答かも知れません。

少し自身で変更してすぐ躓くのは、教えてもらったコードの意味を理解していないせいです。たとえ理解していたとしても、ご自身で検証して解決方法にたどり着けるようにしなければ、先に進みません。

明らかにデバッグしていないようなので、
ある程度のデバッグ方法やデバッグの知識を学習しなければ、これ以上のスキルアップは望めそうにないと思います
一応、3度目なので今後は、デバッグを覚えなさいアドバイスはしませんね。
    • good
    • 1
この回答へのお礼

ご回答いただきありがとうございます。特にセルの結合はしておりません。
なので、
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
t = Worksheets("間隔").Cells(lastrow , j).Offset(-1,0)
で問題があるというのは明らかなのですが、
それがなぜかわからないという状況です。
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value
とすると正常に動くのですが、、、なぜかわからないままです。
上記にも書きましたが、ここであるとの確定はできてますが、それがなぜだかわからないという状況です。

お礼日時:2020/10/22 19:34

No.1です。



私なら。
まずエラーが出た際に変数: j にカーソルを重ねて『 j = ?』と『どの列が問題なのか』を調べますね。

そしてシートの作成方法として横方向にセルを結合したりはしません。
例えばA列とB列が行毎に結合されているとします。
データは2行目以降入ってます。
Cells で1列ずつ最終行を取得するとします。
A列はデータの最後の行が最終行になりますが、B列の最終行は1行目です。
これは結合セルの一番左のセルが有効であってそれより右のセルにはデータが入っていないと言う扱いになります。

シート情報として以前出ていたのかどうかは遡って調べるのも何なので、取り敢えずミスりそうな件と言う事で書かせていただきました。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。特にセルの結合はしておりません。
なので、
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
t = Worksheets("間隔").Cells(lastrow , j).Offset(-1,0)
で問題があるというのは明らかなのですが、
それがなぜかわからないという状況です。
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value
とすると正常に動くのですが、、、なぜかわからないままです。

お礼日時:2020/10/22 19:33

#2です


>ご回答いただきありがとうございます。特にセルの結合はしておりません。
私の回答に結合などと言うキーワードはないと存じます。また、エラー内容なども返信にないようですね。
つまり、時間を割いて回答した内容をろくに読まずに返信された事だと推測します。誠意あるやり取りが出来そうもないので、追記回答を辞退させて頂きます。
悪しからず
    • good
    • 0
この回答へのお礼

何を書くのもご自由ですが、マウントポジション取って話をしてくるなら、二度と回答していただくなくても結構ですよ、ちゃんと読んでます^^、

勝手に誠意がないとか、堂々と書くのはどうかと思いますが?
リアルで会って、面と向かって話ができないさそうなので、
ネット弁慶でこれ以上は追記しないと思いますが、もし面と向かっていいたいから、いつで連絡先教えますので、堂々と話し合いしましょう。

お礼日時:2020/10/22 20:23

念のため、確認させてください。



If lastrow >= 3 Then
.Cells(12, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j)

上記では、動くのですよね?
下記では、アプリケーション定義またはオブジェクト定義のエラーになるのですよね?

If lastrow >= 3 Then
t = Worksheets("間隔").Cells(lastrow - 1, j).Value

または、

If lastrow >= 3 Then
t = Worksheets("間隔").Cells(lastrow , j).offset(-1)
    • good
    • 0
この回答へのお礼

いつもご回答くださってありがとうございます。
はい、そうなのです、、
イミディエイトウインドウには、t = Worksheets("間隔").Cells(lastrow - 1, j).Value

これを入れると、アプリケーション定義またはオブジェクト定義のエラーと出てくるのですが、なら、どうしたらいいのか、、という状態です。。
何が違うんだろうか、、、とずっと悩んでいます。

お礼日時:2020/10/22 21:36

イミディエイトウインドウに、



  t = Worksheets("間隔").Cells(lastrow - 1, j).Value

を入れると、アプリケーション定義またはオブジェクト定義のエラーと出てくるのですか?

  If lastrow >= 3 Then
  .Cells(12, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j)

を入れると動くということですか?

最初の方(動かない方)に、If lastrow >= 3 Then が無いのは何故ですか?
    • good
    • 0
この回答へのお礼

ご回答くださり、ありがとうございます。
If lastrow >= 3 Then
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value

是なら動いています。

n = Worksheets("間隔").Cells(lastrow, j).Value
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
If lastrow >= 3 Then
.Cells(13, j).Value = n + t

としたら、エラーになるということです。

お礼日時:2020/10/22 22:32

それならそうと最初から言ってくれれば、常連回答者さんを失わずに済んだものを・・・(教えてくれる人、減っちゃいましたね。

っていうか、いなくなっちゃうかもですよ)。

さて、本題です。
次の二つは、同じじゃないです(きっぱり!!)

【エラーにならない】
If lastrow >= 3 Then
.Cells(13, j).Value = n + Worksheets("間隔").Cells(lastrow - 1, j).Value

【エラーになる】
n = Worksheets("間隔").Cells(lastrow, j).Value
t = Worksheets("間隔").Cells(lastrow - 1, j).Value
If lastrow >= 3 Then
.Cells(13, j).Value = n + t


例えば、変数 lastrow が、ゼロの場合、エラーにならない方は、何もせずにIF文を抜けます。
方やエラーになる方は、「n=~」の2行分の命令は実行されてしまうので、ここでエラーが発生します。
エラーにならない方と同じにするなら、「If lastrow >= 3 Then」をもっと上に書かないといけません。
    • good
    • 0
この回答へのお礼

ご回答いただきましてありがとうございます、上にすると、エラーがなくなりました、つまり0にしていた、、ということですね、、
ありがとうございます。

お礼日時:2020/10/23 00:10

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