• ベストアンサー

エラーが出てしまいます。

特定の列(C列)に日付が入力されると同じ行の違う列に月名が入力されるマクロをt食ってみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 Then Cells(Target.Row, 10) = Month(Target.Value) End If End Sub しかしC列の一つのセルに入力したときはきちんと作動したのですが、C列の複数セルを選択したときにエラーが出てしまいました。 このエラーを回避する方法はあるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

arget はRangeオブジェクトでセル範囲ですので、Cells(Target.Row, 10) と記述すると Targetが範囲である場合にRowを取得出来ず、「型が一致しません。」エラーになります。 参考までですが、下記のコードにすると複数範囲選択でCtrl+Shift+Enter入力してもOKです。 フィルドラッグコピーにも対応します。 あと、日付を入力(変更)したときということでありば、Changeイベントの方が、 いいのではないかと思います。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Target = Application.Intersect(Range("C:C"), Target) If Target Is Nothing Then Exit Sub For Each Rng In Target   Application.EnableEvents = False   If IsDate(Rng.Value) Then Rng.Offset(, 7) = Month(Rng.Value)   If IsEmpty(Rng) Then Rng.Offset(, 7) = vbNullString   Application.EnableEvents = True Next Rng End Sub

nihonjinn
質問者

お礼

回答ありがとうございます。 Private Sub Worksheet_Change-- でちゃんとエラーにならずにすみました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

多分こんなことがしたいのかなと言うものをコードにしてみました。実用になるか、通常操作以外をガードしているか自信ありませんが。 C3:C7に 2003/9/1 2003/10/2 2003/5/21 2002/11/3 2003/3/23 が入っているとします。 コードは Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 Then t = Target.Range("a1").Row r = Target.Rows.Count For i = t To t + r - 1 If Cells(i, "C") <> "" Then Cells(i, 10) = Month(Cells(i, "c")) End If Next i End If End Sub で、C3:C10(C7を越えて、C8より下までも)を範囲指定すると(越えてしても)、J3:j7に 9 10 5 11 3 と入りました。間にC列の日付けなしブランク行があっても OKです。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 直接の回答ではありませんが。 マクロではなく、通常のワークシート関数ではダメなんでしょうか。 =IF(ISNUMBER(C1),MONTH(C1),"") とか、 =TEXT(C1,"m;;;") などで。

nihonjinn
質問者

お礼

回答ありがとうございます。始めは関数を使っていたのですが、何列もデータがあってファイルサイズが大きくなったのでマクロを使ってみようと思ったのです。

関連するQ&A