Excel VBA質問箱 IV

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

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


1773 / 13645 ツリー ←次へ | 前へ→

【71992】日付があるかどうか判断して・・・ しんく 12/5/14(月) 0:01 質問[未読]
【71993】Re:日付があるかどうか判断して・・・ Yuki 12/5/14(月) 15:35 発言[未読]
【71994】Re:日付があるかどうか判断して・・・ しんく 12/5/14(月) 17:58 質問[未読]
【71995】Re:日付があるかどうか判断して・・・ Yuki 12/5/14(月) 19:13 発言[未読]
【72004】Re:日付があるかどうか判断して・・・ しんく 12/5/16(水) 9:48 質問[未読]
【72007】Re:日付があるかどうか判断して・・・ kanabun 12/5/16(水) 10:22 発言[未読]
【72016】Re:日付があるかどうか判断して・・・ しんく 12/5/16(水) 15:39 発言[未読]
【72018】Re:日付があるかどうか判断して・・・ kanabun 12/5/16(水) 17:32 発言[未読]
【72032】Re:日付があるかどうか判断して・・・ しんく 12/5/17(木) 21:09 質問[未読]
【72033】Re:日付があるかどうか判断して・・・ kanabun 12/5/17(木) 23:06 発言[未読]
【72034】Re:日付があるかどうか判断して・・・ しんく 12/5/20(日) 22:25 お礼[未読]
【72006】Re:日付があるかどうか判断して・・・ しんく 12/5/16(水) 9:50 質問[未読]
【72013】Re:日付があるかどうか判断して・・・ Yuki 12/5/16(水) 13:40 発言[未読]
【72015】Re:日付があるかどうか判断して・・・ しんく 12/5/16(水) 15:34 発言[未読]
【72019】Re:日付があるかどうか判断して・・・ Yuki 12/5/16(水) 18:10 発言[未読]
【72020】Re:日付があるかどうか判断して・・・ kanabun 12/5/16(水) 19:02 発言[未読]
【72021】Re:日付があるかどうか判断して・・・ Yuki 12/5/16(水) 20:22 発言[未読]
【72031】Re:日付があるかどうか判断して・・・ しんく 12/5/17(木) 20:56 発言[未読]
【72035】Re:日付があるかどうか判断して・・・ しんく 12/5/20(日) 22:28 お礼[未読]

【71992】日付があるかどうか判断して・・・
質問  しんく  - 12/5/14(月) 0:01 -

引用なし
パスワード
   マクロ不慣れです。
アドバイスをお願いします。

B30から最終行に記載されている日付を取得し、
B25の発生時間: yyyy/mm/dd hh:mm として記載を考えています。

ただB30から最終行には複数時間が記載される場合があります。
その場合はyyyy/mm/dd hh:mm、hh:mm、hh:mmのように記載したいのです。
セルの表示ではhh:mmを指定しています。(数式バーではyyyy/mm/dd hh:mmです)

複数あった場合の対処の仕方がよくわかりませんでした。
又、時間がシリアル値で表示されてしまい、取得がうまくできません。
どのようにするのが、効率的でしょうか。

【71993】Re:日付があるかどうか判断して・・・
発言  Yuki  - 12/5/14(月) 15:35 -

引用なし
パスワード
   ▼しんく さん:
>ただB30から最終行には複数時間が記載される場合があります。
>その場合はyyyy/mm/dd hh:mm、hh:mm、hh:mmのように記載したいのです。

どのように日付時間が表示(入力)されているのですか?
yyyy/mm/dd hh:mm、hh:mm、hh:mmのようだったらそのままですよね。

【71994】Re:日付があるかどうか判断して・・・
質問  しんく  - 12/5/14(月) 17:58 -

引用なし
パスワード
   Yukiさん、返信ありがとうございます。


   B列

B25 発生時間:
B26
B27
B28
B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
B30 18:10 aaaaaaaaaaa
B31     bbbbbbbbbbb
B32     ccccccccccc
B33 (表示形式はhhmmです。2012/5/14 18:20と入力されています)
B34 18:20 aaaaaaaaaaa
B35     bbbbbbbbbbb
B36     ccccccccccc
B37 (表示形式はhhmmです。2012/5/14 18:30と入力されています)
B38 18:30 aaaaaaaaaaa
B39     bbbbbbbbbbb
B40     ccccccccccc  

上記を下記のように考えています。

   B列

B25 発生時間:2012/5/14 18:10、18:20、18:30
B26
B27
B28
B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
B30 18:10 aaaaaaaaaaa
B31     bbbbbbbbbbb
B32     ccccccccccc
B33 (表示形式はhhmmです。2012/5/14 18:20と入力されています)
B34 18:20 aaaaaaaaaaa
B35     bbbbbbbbbbb
B36     ccccccccccc
B37 (表示形式はhhmmです。2012/5/14 18:30と入力されています)
B38 18:30 aaaaaaaaaaa
B39     bbbbbbbbbbb
B40     ccccccccccc 

上記のように実施することは可能でしょうか?
よろしくお願いします。


▼Yuki さん:
>▼しんく さん:
>>ただB30から最終行には複数時間が記載される場合があります。
>>その場合はyyyy/mm/dd hh:mm、hh:mm、hh:mmのように記載したいのです。
>
>どのように日付時間が表示(入力)されているのですか?
>yyyy/mm/dd hh:mm、hh:mm、hh:mmのようだったらそのままですよね。

【71995】Re:日付があるかどうか判断して・・・
発言  Yuki  - 12/5/14(月) 19:13 -

引用なし
パスワード
   ▼しんく さん:
>   B列
>
>B25 発生時間:
>B26
>B27
>B28
>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>B30 18:10 aaaaaaaaaaa

B29に2012/5/14 18:10 と入力されているのですか?
上記を無視して
とりあえずB30からの最終行(今回は B30,B34,B38)迄

Sub TESTa()
  Dim i    As Long
  Dim j    As Long
  Dim sYmd  As String
  Dim sTime() As String

  i = 30
  Do While Cells(i, 1).Value <> ""
    If i = 30 Then
      sYmd = Range("B25").Value & Date
      ReDim sTime(j)
      sTime(j) = Left(Cells(i, 1).Value, 5)
    Else
      ReDim Preserve sTime(j)
      sTime(j) = Left(Cells(i, 1).Value, 5)
    End If
    j = j + 1
    i = i + 4
  Loop
  Range("B25").Value = sYmd & " " & Join(sTime, ", ")
End Sub

【72004】Re:日付があるかどうか判断して・・・
質問  しんく  - 12/5/16(水) 9:48 -

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

申し訳ありません。一部訂正があります。

日付について、シリアル値になっていました。
この場合ですが、シリアル値→日付に変換するには
どうしたらよいでしょうか?

お手数ですが、よろしくお願いします。


>▼しんく さん:
>>   B列
>>
>>B25 発生時間:
>>B26
>>B27
>>B28
>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>B30 18:10 aaaaaaaaaaa
>
>B29に2012/5/14 18:10 と入力されているのですか?
>上記を無視して
>とりあえずB30からの最終行(今回は B30,B34,B38)迄
>
>Sub TESTa()
>  Dim i    As Long
>  Dim j    As Long
>  Dim sYmd  As String
>  Dim sTime() As String
>
>  i = 30
>  Do While Cells(i, 1).Value <> ""
>    If i = 30 Then
>      sYmd = Range("B25").Value & Date
>      ReDim sTime(j)
>      sTime(j) = Left(Cells(i, 1).Value, 5)
>    Else
>      ReDim Preserve sTime(j)
>      sTime(j) = Left(Cells(i, 1).Value, 5)
>    End If
>    j = j + 1
>    i = i + 4
>  Loop
>  Range("B25").Value = sYmd & " " & Join(sTime, ", ")
>End Sub

【72006】Re:日付があるかどうか判断して・・・
質問  しんく  - 12/5/16(水) 9:50 -

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

申し訳ありません。一部訂正があります。

日付について、シリアル値になっていました。
この場合ですが、シリアル値→日付に変換するには
どうしたらよいでしょうか?
代入した際にシリアル値で取得してます。

お手数ですが、よろしくお願いします。


>▼しんく さん:
>>   B列
>>
>>B25 発生時間:
>>B26
>>B27
>>B28
>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>B30 18:10 aaaaaaaaaaa
>
>B29に2012/5/14 18:10 と入力されているのですか?
>上記を無視して
>とりあえずB30からの最終行(今回は B30,B34,B38)迄
>
>Sub TESTa()
>  Dim i    As Long
>  Dim j    As Long
>  Dim sYmd  As String
>  Dim sTime() As String
>
>  i = 30
>  Do While Cells(i, 1).Value <> ""
>    If i = 30 Then
>      sYmd = Range("B25").Value & Date
>      ReDim sTime(j)
>      sTime(j) = Left(Cells(i, 1).Value, 5)
>    Else
>      ReDim Preserve sTime(j)
>      sTime(j) = Left(Cells(i, 1).Value, 5)
>    End If
>    j = j + 1
>    i = i + 4
>  Loop
>  Range("B25").Value = sYmd & " " & Join(sTime, ", ")
>End Sub

【72007】Re:日付があるかどうか判断して・・・
発言  kanabun  - 12/5/16(水) 10:22 -

引用なし
パスワード
   ▼しんく さん:
よこからスミマセン m(_ _)m

>>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>>B30 18:10 aaaaaaaaaaa
>>
>>B29に2012/5/14 18:10 と入力されているのですか?

[B29] に日付が入力されているのですか?
それとも、[B30]に 日付( 2012/5/14 18:10) と 文字列 "aaaaaaaaaaa"
が連続して入力されているのですか?

後者だとしたばあい、
何もしなければ "2012/5/14 18:10 aaaaaaaaaaa" と
文字列で表示されちゃいますよね?
セル[B30]の表示形式はどのようなものですか?

【72013】Re:日付があるかどうか判断して・・・
発言  Yuki  - 12/5/16(水) 13:40 -

引用なし
パスワード
   ▼しんく さん:
>申し訳ありません。一部訂正があります。
>日付について、シリアル値になっていました。
>この場合ですが、シリアル値→日付に変換するには
>どうしたらよいでしょうか?
>代入した際にシリアル値で取得してます。

日付 = Cdate(シリアル値)

>>▼しんく さん:
>>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>>B30 18:10 aaaaaaaaaaa
>>
>>B29に2012/5/14 18:10 と入力されているのですか?
>>B30 18:10 aaaaaaaaaaa

上記の返答がまだですが。

【72015】Re:日付があるかどうか判断して・・・
発言  しんく  - 12/5/16(水) 15:34 -

引用なし
パスワード
   ▼Yuki さん:

返信ありがとうございます。

下記の件、返答するのを忘れ、すいません。

(表示形式はhhmmです。2012/5/14 18:10と入力されています)の部分は
あくまで補足であり、記載されていません。

>▼しんく さん:
>>申し訳ありません。一部訂正があります。
>>日付について、シリアル値になっていました。
>>この場合ですが、シリアル値→日付に変換するには
>>どうしたらよいでしょうか?
>>代入した際にシリアル値で取得してます。
>
>日付 = Cdate(シリアル値)
>
>>>▼しんく さん:
>>>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>>>B30 18:10 aaaaaaaaaaa
>>>
>>>B29に2012/5/14 18:10 と入力されているのですか?
>>>B30 18:10 aaaaaaaaaaa
>
>上記の返答がまだですが。

【72016】Re:日付があるかどうか判断して・・・
発言  しんく  - 12/5/16(水) 15:39 -

引用なし
パスワード
   ▼kanabun さん:

下記の件について、記載の仕方が変でした。

aaaaaaaaaaaの部分はC列に記載されています。
ですので、B列に日付、C列に文字列になります。

お手数を掛けていません。

>▼しんく さん:
>よこからスミマセン m(_ _)m
>
>>>>B29 (表示形式はhhmmです。2012/5/14 18:10と入力されています)
>>>>B30 18:10 aaaaaaaaaaa
>>>
>>>B29に2012/5/14 18:10 と入力されているのですか?
>
>[B29] に日付が入力されているのですか?
>それとも、[B30]に 日付( 2012/5/14 18:10) と 文字列 "aaaaaaaaaaa"
>が連続して入力されているのですか?
>
>後者だとしたばあい、
>何もしなければ "2012/5/14 18:10 aaaaaaaaaaa" と
>文字列で表示されちゃいますよね?
>セル[B30]の表示形式はどのようなものですか?

【72018】Re:日付があるかどうか判断して・・・
発言  kanabun  - 12/5/16(水) 17:32 -

引用なし
パスワード
   ▼しんく さん:
>▼kanabun さん:
>
>下記の件について、記載の仕方が変でした。
>aaaaaaaaaaaの部分はC列に記載されています。
>ですので、B列に日付、C列に文字列になります。
>
そしたら、こんな按配でどうですかね
日付けのセルを(シリアル値を)"、hh:nn"形式にFormatして文字列を
連結しています。
Sub Try1()
 Dim c As Range
 Dim ss As String
 
 For Each c In Range("B30", Cells(Rows.Count, 2).End(xlUp))
   If IsDate(c.Text) Then
     If Len(ss) = 0 Then
       ss = Format$(c.Value2, "yyyy/mm/dd hh:nn")
     Else
       ss = ss & Format$(c.Value2, "、hh:nn")
     End If
   End If
 Next
 Range("B25").Value = "発生時間:" & ss

End Sub

【72019】Re:日付があるかどうか判断して・・・
発言  Yuki  - 12/5/16(水) 18:10 -

引用なし
パスワード
   ▼しんく さん:
こんな感じです。前回はA列でしたのでB列にしています。
それとシリアル値であっても下記でOKですよ。

Sub TESTa()
  Dim i    As Long
  Dim j    As Long
  Dim sYmd  As String
  Dim sTime() As String

  i = 30
  Do While Cells(i, 2).Value <> ""
    If i = 30 Then
      sYmd = Range("B25").Value & Format(Cells(i, 2).Value, "yyyy/mm/dd hh:mm")
    Else
      ReDim Preserve sTime(j)
      sTime(j) = Format(Cells(i, 2).Value, "hh:mm")
    End If
    j = j + 1
    i = i + 4
  Loop
  Range("B25").Value = sYmd & " " & Join(sTime, ", ")
End Sub

【72020】Re:日付があるかどうか判断して・・・
発言  kanabun  - 12/5/16(水) 19:02 -

引用なし
パスワード
   ▼Yuki さん:
> i = i + 4

>> B30から最終行に記載されている日付を取得し、
>> ただB30から最終行には複数時間が記載される場合があります。
ということで、
「B30から4行おきに日付データ」があるとは限らないのでは?

【72021】Re:日付があるかどうか判断して・・・
発言  Yuki  - 12/5/16(水) 20:22 -

引用なし
パスワード
   ▼kanabun さん:
>
>>> B30から最終行に記載されている日付を取得し、
>>> ただB30から最終行には複数時間が記載される場合があります。
>ということで、
>「B30から4行おきに日付データ」があるとは限らないのでは?

解釈の違いですかね。質問者さんのからの書き込みを待ちますね。
もしkanabunさんの通りでしたら
for next で一行ずつ日付かチェックしていく方向でしょうね。

【72031】Re:日付があるかどうか判断して・・・
発言  しんく  - 12/5/17(木) 20:56 -

引用なし
パスワード
   ▼Yuki さん:

下記の件について、kanabunさんが仰る通りです。
どこに日付が入るか事象毎に変化します。
説明が不十分で申し訳ありません。

>▼kanabun さん:
>>
>>>> B30から最終行に記載されている日付を取得し、
>>>> ただB30から最終行には複数時間が記載される場合があります。
>>ということで、
>>「B30から4行おきに日付データ」があるとは限らないのでは?
>
>解釈の違いですかね。質問者さんのからの書き込みを待ちますね。
>もしkanabunさんの通りでしたら
>for next で一行ずつ日付かチェックしていく方向でしょうね。

【72032】Re:日付があるかどうか判断して・・・
質問  しんく  - 12/5/17(木) 21:09 -

引用なし
パスワード
   ▼kanabun さん:

下記の件について、返信ありがとうございます。
日付取得がここまでややこしいとは思いませんでした。
簡潔でスマートな表現でしたので、とても参考になります。
1点だけよろいいでしょうか。
日付の重複チェックを追加することは難しいですか。
B列の日付で18:00と18:00があった場合、片方は不要にしたいのです。

お手数ですが、よろしくお願いします。

>▼しんく さん:
>>▼kanabun さん:
>>
>>下記の件について、記載の仕方が変でした。
>>aaaaaaaaaaaの部分はC列に記載されています。
>>ですので、B列に日付、C列に文字列になります。
>>
>そしたら、こんな按配でどうですかね
>日付けのセルを(シリアル値を)"、hh:nn"形式にFormatして文字列を
>連結しています。
>Sub Try1()
> Dim c As Range
> Dim ss As String
> 
> For Each c In Range("B30", Cells(Rows.Count, 2).End(xlUp))
>   If IsDate(c.Text) Then
>     If Len(ss) = 0 Then
>       ss = Format$(c.Value2, "yyyy/mm/dd hh:nn")
>     Else
>       ss = ss & Format$(c.Value2, "、hh:nn")
>     End If
>   End If
> Next
> Range("B25").Value = "発生時間:" & ss
>
>End Sub

【72033】Re:日付があるかどうか判断して・・・
発言  kanabun  - 12/5/17(木) 23:06 -

引用なし
パスワード
   ▼しんく さん:

>1点だけよろいいでしょうか。
>日付の重複チェックを追加することは難しいですか。
>B列の日付で18:00と18:00があった場合、片方は不要にしたいのです。
Try1() をすこし修正して、
すでにある文字列の中に 追加しようとしている文字列がないときだけ
時刻を追加しています。

Sub Try1b() '重複時刻カット
 Dim c As Range
 Dim ss As String
 Dim st As String
 
 For Each c In Range("B30", Cells(Rows.Count, 2).End(xlUp)) _
       .SpecialCells(xlCellTypeConstants, xlNumbers)
   If IsDate(c.Text) Then
     If Len(ss) = 0 Then
       ss = Format$(c.Value2, "yyyy/mm/dd hh:nn")
     Else
       st = Format$(c.Value2, "hh:nn")
       If InStr(ss, st) = 0 Then ss = ss & ("、" & st)
     End If
   End If
 Next
 Range("B25").Value = "発生時間:" & ss

End Sub

【72034】Re:日付があるかどうか判断して・・・
お礼  しんく  - 12/5/20(日) 22:25 -

引用なし
パスワード
   ▼kanabun さん:

返信ありがとうございます。
問題なく処理してくれました。
ありがとうございます。
ちょっと分からない部分もありますが、
調べて確認させていただきます。

とても参考にありました。


>▼しんく さん:
>
>>1点だけよろいいでしょうか。
>>日付の重複チェックを追加することは難しいですか。
>>B列の日付で18:00と18:00があった場合、片方は不要にしたいのです。
>Try1() をすこし修正して、
>すでにある文字列の中に 追加しようとしている文字列がないときだけ
>時刻を追加しています。
>
>Sub Try1b() '重複時刻カット
> Dim c As Range
> Dim ss As String
> Dim st As String
> 
> For Each c In Range("B30", Cells(Rows.Count, 2).End(xlUp)) _
>       .SpecialCells(xlCellTypeConstants, xlNumbers)
>   If IsDate(c.Text) Then
>     If Len(ss) = 0 Then
>       ss = Format$(c.Value2, "yyyy/mm/dd hh:nn")
>     Else
>       st = Format$(c.Value2, "hh:nn")
>       If InStr(ss, st) = 0 Then ss = ss & ("、" & st)
>     End If
>   End If
> Next
> Range("B25").Value = "発生時間:" & ss
>
>End Sub

【72035】Re:日付があるかどうか判断して・・・
お礼  しんく  - 12/5/20(日) 22:28 -

引用なし
パスワード
   ▼Yuki さん:

本件について、色々とお手数をお掛けしました。
色々な表現な仕方があり、マクロは本当に面白いですね。
とても参考になりました。
ありがとうございます。

>▼kanabun さん:
>>
>>>> B30から最終行に記載されている日付を取得し、
>>>> ただB30から最終行には複数時間が記載される場合があります。
>>ということで、
>>「B30から4行おきに日付データ」があるとは限らないのでは?
>
>解釈の違いですかね。質問者さんのからの書き込みを待ちますね。
>もしkanabunさんの通りでしたら
>for next で一行ずつ日付かチェックしていく方向でしょうね。

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