電子書籍の厳選無料作品が豊富!

添付図、納入日から本日8/6迄の月数を表示します。
Cells(1,1)に日付が入力されている時はCells(6,9)に月数が計算され表示されますが
Cells(1,1)をDeleteして空欄にすると「実行時エラー'13'型が一致しません」とエラーになってしまいます。以下のコードをどのように修正したらいいでしょうか宜しく御願いします。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim 行 As Long
行 = Cells(Rows.Count, 1).End(xlUp).Row
Cells(6, 9) = (Date - Cells(行, 1)) / 30
End Sub

「Excelマクロでセルに値が入力されたら」の質問画像

A 回答 (5件)

質問の中の Cells(1,1) は、Cells(11,1) ですよね。


で、Cells(11,1)を空欄にしたときにどういう処理をしたいの?
そこが書かれてないわけですが…

単純に、Cells(11,1)以下が空欄の状態だと
「行」取得すると入力のある「10」が返ると思うので、
以下の内容では、
① 行が11より小さければ"Error"表示。
② ①に該当しなければ計算結果表示。
としています。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim 行 As Long
  行 = Cells(Rows.Count, 1).End(xlUp).Row
  
  If 行 < 11 Then
    Cells(6, 9) = "Error"
  Else
    Cells(6, 9) = (Date - Cells(行, 1)) / 30
  End If
End Sub

余談
経過月は、Int等で切捨てたりしなくていいのかな?
    • good
    • 1
この回答へのお礼

早速の回答有難う御座います。
すいませんCells(1,1) は、Cells(11,1) です間違えました。
Cells(11,1)が空欄の時はCells(6, 9)を空欄にしたいのです。
いただいたコードで出来ました。

お礼日時:2023/08/06 18:44

コメント拝見しました。


すでに修正部分の回答は上がってますが…。

① 行が11より小さければ"Error"表示。 

この部分の説明から
『"Error"じゃなくて、何も表示したくないんだ』
ってことであれば、
"Error" → ""
にすればいいんだな、という発想に繋げられるようにしましょう。
他人の作ったマクロの加工って、こういう発想から手を入れて覚えられることも多いので。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim 行 As Long
  行 = Cells(Rows.Count, 1).End(xlUp).Row
  
  If 行 < 11 Then
    Cells(6, 9) = ""  '←No.1からはココだけを修正
  Else
    Cells(6, 9) = (Date - Cells(行, 1)) / 30
  End If
End Sub


No.4の方の回答だと、日付入力がない場合、
  Date - "納入日"
というように 日付 から 「納入日」という文字列を引こうとするので、エラーでマクロが中断するでしょう。
    • good
    • 0
この回答へのお礼

アドバイス有難う御座います。
希望の通りになりました。有難う御座いました。

お礼日時:2023/08/06 22:56

>>Cells(11,1)が空欄の時はCells(6, 9)を空欄にしたいのです。



Cells(6, 9) = (Date - Cells(行, 1)) / 30
を以下に修正

if Cells(行, 1)="" or Cells(行, 1)=" " then
 Cells(6, 9)=""
else
 Cells(6, 9) = (Date - Cells(行, 1)) / 30
Endif
    • good
    • 0
この回答へのお礼

解説有難う御座います。確認してみます。

お礼日時:2023/08/06 22:55

こんにちは



処理としてはさほど複雑ではないと思いますが、いろいろ考えるべきことがありそうですね。

● 既にNo1様のご指摘にもありますが、計算できない場合にどうするのか。
(例えば、全部空欄だったり、日付以外の値を(誤って)入力した場合など)
● ご提示の計算ではひと月を30日としているようですが、例えば、A列の値が2/1で、今日が3/1の場合、0.9ヶ月(少数以下1桁として)となりますが、果たしてそれで良いのか。
(3/1、2/1の間は30日ないけれど、普通は1か月と見做すので‥)
● 入力欄(?)はA11:A20のように見受けられますが、ご提示のコードではA30セルに何か入力しても反応してしまいますが・・
● ご提示では入力最大行の値を採用していますが、もしかすると、入力値の最新日付(=最大値)を使用するという可能性はないのかなどと勝手に想像してしまったりします。
・・・などなど。

その他にも、CHangeイベントで処理をする場合の注意点として、マクロからシートの値を変えてもイベントが発生します。
ですので、処理の内容によってはエンドレスになってしまう可能性がありますので、注意が必要になります。
対策として、イベント発生を一時停止させるなどの処置が必要な場合があります。
(ご提示の内容の場合は、計算結果は変わらないので、2回同じ計算をする程度ですけれど・・)


ちなみに、関数式で処理する方向で、勝手な推測を元に考えてみたものが以下です。
(勝手な推測なので、質問者様の意図通りかどうかは不明です)
ご提示のレイアウトで、I6セルに以下の式を設定し、セルの書式設定を数値で、少数以下1桁にすることで表示できると思います。
=IF(ISNUMBER(INDEX(A:A,AGGREGATE(14,6,ROW(A11:A20)/(A11:A20<>""),1))),DATEDIF(INDEX(A:A,AGGREGATE(14,6,ROW(A11:A20)/(A11:A20<>""),1)),TODAY(),"M")+ROUND((DAY(TODAY())-DAY(INDEX(A:A,AGGREGATE(14,6,ROW(A11:A20)/(A11:A20<>""),1))))/30,1),"計算不能")
    • good
    • 0
この回答へのお礼

詳細な解説有難う御座います。関数での方法勉強になります参考にさせていただきます。

お礼日時:2023/08/06 22:05

Cellsは行・列ですよ、Cells(1,11)は1行11列です。



結局、納入日が無い場合に経過月をドー表示したいのか?です。

どー表示したいのですか?

本日日付から空白nullを引き算なんか出来ないからエラーになるのです。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
すいませんCells(1,1) は、Cells(11,1) です間違えました。
Cells(11,1)が空欄の時はCells(6, 9)を空欄にしたいのです。
10行目が選択されてエラーになるのはわかっていたのですがその対処法がわかりませんでした。

お礼日時:2023/08/06 18:46

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