Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5984 / 13644 ツリー ←次へ | 前へ→

【47844】入力方法の色々 takashi 07/3/24(土) 3:19 質問[未読]
【47845】Re:入力方法の色々 ウッシ 07/3/24(土) 10:49 発言[未読]
【47846】Re:入力方法の色々 takashi 07/3/24(土) 11:05 発言[未読]
【47847】Re:入力方法の色々 ウッシ 07/3/24(土) 11:48 発言[未読]
【47848】Re:入力方法の色々 Hirofumi 07/3/24(土) 12:17 回答[未読]
【47849】Re:入力方法の色々 ウッシ 07/3/24(土) 12:24 発言[未読]
【47850】Re:入力方法の色々 takashi 07/3/24(土) 12:35 発言[未読]
【47854】Re:入力方法の色々 Hirofumi 07/3/24(土) 16:19 回答[未読]
【47873】Re:入力方法の色々 takashi 07/3/25(日) 1:15 お礼[未読]

【47844】入力方法の色々
質問  takashi  - 07/3/24(土) 3:19 -

引用なし
パスワード
   お願いします。
下記コードにて日付を入力しているのですが

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim 各々のセル As Range

  If Intersect(Target, Range("C28:C500")) Is Nothing Then
    Exit Sub
  End If
 
  Application.EnableEvents = False

  For Each 各々のセル In Intersect(Target, Range("C28:C500"))
    If IsNumeric(各々のセル.Value2) And 各々のセル.Value2 <> "" Then
      If 各々のセル.Value2 <= 31 Then
        If Day(Date) >= 25 Then
          各々のセル.Value = Format(DateSerial(Year(Date), Month(Date) + 1, Day(各々のセル.Value2) + 1), "gee.mm.dd")
        Else
          各々のセル.Value = Format(DateSerial(Year(Date), Month(Date), Day(各々のセル.Value2) + 1), "gee.mm.dd")
        End If
      End If
    End If
  Next

  Application.EnableEvents = True
End Sub
上記コードで入力した場合の数式バーの表示はH19.03.20です
仮に下記の様に手入力した場合は
H19/03/20数式バーに表示されるのは
2007/3/20となります。

H19/03/20とセルに直接入力したときに
数式バーに同じようにH19.03.20と表示するよう
上のコードに組み込むこと出来ませんか。
よろしくお願いします。
説明が下手かも?

【47845】Re:入力方法の色々
発言  ウッシ  - 07/3/24(土) 10:49 -

引用なし
パスワード
   こんにちは

>数式バーに同じようにH19.03.20と表示するよう
そのような方法が有るなら知識として知ってはおきたいですが・・・

数式バーを非表示にするのではダメなのですよね?

【47846】Re:入力方法の色々
発言  takashi  - 07/3/24(土) 11:05 -

引用なし
パスワード
   ▼ウッシ さん:
ありがとうございます。
提示したコードではH19.03.20という表示になります
Format形式が"gee.mm.dd"に設定で表示されますよね
C28からスタートしていてC28を別のセルで読んでいるのですが
Format形式がH19.03.20の場合と2007/3/20では
表示が変わってしまうものですから統一表示にしたいと
思ったのですができませんかね?


>
>>数式バーに同じようにH19.03.20と表示するよう
>そのような方法が有るなら知識として知ってはおきたいですが・・・
>
>数式バーを非表示にするのではダメなのですよね?
ダメかどうか解らないのですが非表示にする方法とは?
教えて下さい。ちっょとテストしてみたいので

【47847】Re:入力方法の色々
発言  ウッシ  - 07/3/24(土) 11:48 -

引用なし
パスワード
   こんにちは

意味が良く分からないのですが、数式バーが関係した事なのでしょうか?

>C28からスタートしていてC28を別のセルで読んでいるのですが
>Format形式がH19.03.20の場合と2007/3/20では
>表示が変わってしまう

Sub test1()
  MsgBox Range("C28").Text
  MsgBox Range("C28").Value
  MsgBox Range("C28").Value2
End Sub

現在、「C28を別のセルで読む」とはどのような処理コードなのでしょうか?
セル上の数式ならちょっと違うでしょうけど。

数式バーは
  Application.DisplayFormulaBar = False
で消えます。
(Excel2007は違うと思います。)

【47848】Re:入力方法の色々
回答  Hirofumi  - 07/3/24(土) 12:17 -

引用なし
パスワード
   実状に合うか、解りませんが?
要は、シリアル値としてセルに代入せず文字列にすると言う事ですか?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  Const strForm As String = "gee.mm.dd"
  
  Dim 各々のセル As Range
  Dim lngYear As Long
  Dim lngMonth As Long
  Dim lngDay As Long
  
  If Intersect(Target, Range("C28:C500")) Is Nothing Then
    Exit Sub
  End If

  Application.EnableEvents = False

  For Each 各々のセル In Intersect(Target, Range("C28:C500"))
    If 各々のセル.Value2 <> "" Then
      If IsDate(各々のセル.Value) Then
        lngYear = Year(各々のセル.Value)
        lngMonth = Month(各々のセル.Value)
        lngDay = Day(各々のセル.Value) + 1
      Else
        If IsNumeric(各々のセル.Value2) Then
          If 各々のセル.Value2 <= 31 Then
            lngYear = Year(Date)
            lngMonth = Month(Date)
            lngDay = Day(各々のセル.Value2) + 1
          End If
        End If
      End If
      If Day(Date) >= 25 Then
        lngMonth = lngMonth + 1
      End If
      各々のセル.Value = Format(DateSerial(lngYear, lngMonth, lngDay), strForm)
    End If
  Next

  Application.EnableEvents = True
  
End Sub

【47849】Re:入力方法の色々
発言  ウッシ  - 07/3/24(土) 12:24 -

引用なし
パスワード
   こんにちは

やっぱりそうなんでしょうか?
完全に文字列で。

とするとセルの書式を文字列にしておくだけで良さそうなのですが?

【47850】Re:入力方法の色々
発言  takashi  - 07/3/24(土) 12:35 -

引用なし
パスワード
   ▼Hirofumi さん:
ありがとうございます。

7/3/20と入力した場合のみH19.03.20と表示させたいのですが
最初のコードの機能を残したいのですが・・・
下記のコードで20と入力するとM33.01.20になってしまいます
それと7/3/20と入力した場合H19.03.21となり1プラスとなりますが
プラス1は不要です。

わかりにくい説明ですみません。
よろしくお願いします。

>実状に合うか、解りませんが?
>要は、シリアル値としてセルに代入せず文字列にすると言う事ですか?
>
>Option Explicit
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>
>  Const strForm As String = "gee.mm.dd"
>  
>  Dim 各々のセル As Range
>  Dim lngYear As Long
>  Dim lngMonth As Long
>  Dim lngDay As Long
>  
>  If Intersect(Target, Range("C28:C500")) Is Nothing Then
>    Exit Sub
>  End If
>
>  Application.EnableEvents = False
>
>  For Each 各々のセル In Intersect(Target, Range("C28:C500"))
>    If 各々のセル.Value2 <> "" Then
>      If IsDate(各々のセル.Value) Then
>        lngYear = Year(各々のセル.Value)
>        lngMonth = Month(各々のセル.Value)
>        lngDay = Day(各々のセル.Value) + 1
                        ↑プラス1を削除すると
                        H19.3.20となりOKです
>      Else
>        If IsNumeric(各々のセル.Value2) Then
>          If 各々のセル.Value2 <= 31 Then
>            lngYear = Year(Date)
>            lngMonth = Month(Date)
>            lngDay = Day(各々のセル.Value2) + 1
>          End If
>        End If
>      End If
>      If Day(Date) >= 25 Then
>        lngMonth = lngMonth + 1
>      End If
>      各々のセル.Value = Format(DateSerial(lngYear, lngMonth, lngDay), strForm)
>    End If
>  Next
>
>  Application.EnableEvents = True
>  
>End Sub

【47854】Re:入力方法の色々
回答  Hirofumi  - 07/3/24(土) 16:19 -

引用なし
パスワード
   >7/3/20と入力した場合のみH19.03.20と表示させたいのですが
>最初のコードの機能を残したいのですが・・・

元のコードでも、「7/3/20」→「H19.03.20」とは成らないのでは?
元のコードでは、「7/3/20」→「2007/3/20」と成ると思うのですが(Excel97以外では)

>下記のコードで20と入力するとM33.01.20になってしまいます

此れは、IsDateで確認を取っている為、セルの書式が日付に成って居る場合に起こります

>それと7/3/20と入力した場合H19.03.21となり1プラスとなりますが
>プラス1は不要です。

此れは、要求仕様が説明されて無いので、日付が何を持ってプラスされるのかが解りませんで
其のまま書いて有ります?

そこら辺を少し直して見ました

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  Const strForm As String = "gee.mm.dd"
  
  Dim 各々のセル As Range
  Dim lngYear As Long
  Dim lngMonth As Long
  Dim lngDay As Long
  
  If Intersect(Target, Range("C28:C500")) Is Nothing Then
    Exit Sub
  End If

  Application.EnableEvents = False

  For Each 各々のセル In Intersect(Target, Range("C28:C500"))
    With 各々のセル
      If .Value <> "" Then
        If IsNumeric(.Value) Or IsDate(.Value) Then
          If 1 <= .Value And .Value <= 31 Then
            lngYear = Year(Date)
            lngMonth = Month(Date)
            lngDay = .Value
          Else
            lngYear = Year(.Value)
            lngMonth = Month(.Value)
            lngDay = Day(.Value)
          End If
          If Day(Date) >= 25 Then
            lngMonth = lngMonth + 1
          End If
          .NumberFormatLocal = "G/標準"
          .Value = Format(DateSerial(lngYear, lngMonth, lngDay), strForm)
        End If
      End If
    End With
  Next

  Application.EnableEvents = True
  
End Sub

【47873】Re:入力方法の色々
お礼  takashi  - 07/3/25(日) 1:15 -

引用なし
パスワード
   ▼Hirofumi さん:
ウッシさん
いろいろご意見・説明・有用なコード
ありがとうございました。
試してみます。

5984 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free