[[20180802182205]] 『文字列を日付化』(こっこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列を日付化』(こっこ)

はじめましてエクセル初心者です。ここ4日いろんなサイトやページを探していましたが見つからなかったので質問させてください。
J列に日付がどばっと入っています。所々空欄もあります。(文字列で20180101のように8桁で)これを連続作業でdate化したいのですがループがいまいち理解できず構文を組めずにいます。
日付の開始行は4行目からでデータは1000以上あるかもしれません。ご助力お願いいたします。

< 使用 Excel:unknown、使用 OS:Windows7 >


これを使ってみましたがうまくいきませんでした
Sub A列の8桁の数字を日付にする()
 Dim org As String
 Dim buf As String
 Dim i As Long
 For i = 1 To Range("J4").End(xlDown).Row
 With Cells(i, "J")
  org = .Value
  If Len(org) = 8 Then
   buf = Format(org, "@@@@/@@/@@")
   If IsDate(buf) = True Then
    .Value = buf
    .NumberFormatLocal = "yyyy/mm/dd"
   End If ' IsDate
  End If ' Len = 8
 End With ' Cells(i, "J")
 Next i
End Sub
(こっこ) 2018/08/02(木) 18:38

区切り位置で日付にできませんか?

(マナ) 2018/08/02(木) 18:40


'J列の20180802をK列に日付型の2018/8/2で書き出す
Sub a()
    Dim i As Long
    Dim s As String
    For i = 4 To ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1
        s = Cells(i, "J").Value
        If s Like "########" Then
            Cells(i, "K").Value = DateSerial(Left(s, 4), Mid(s, 5, 2), Right(s, 2))
        End If
    Next
End Sub

またはK4に
=DATEVALUE(LEFT(J4,4)&"/"&MID(J4,5,2)&"/"&RIGHT(J4,2))
と入れてコピー
(名無し) 2018/08/02(木) 18:48


参考になれば幸いです。

Sub Macro例()

    Dim i As Long, oug As String
    With ThisWorkbook.Sheets("Sheet1")
        For i = 4 To .Range("J4").End(xlDown).Row
            oug = .Cells(i, "J").Value
            If Len(oug) = 8 Then
                .Cells(i, "J") = Format(DateSerial(Left(oug, 4), Mid(oug, 5, 2), Right(oug, 2)), "YYYY/M/D")
            End If
        Next i
    End With
End Sub

(TAKA) 2018/08/02(木) 18:49


 基本的には旨く書けていますよ。

 これがネックなんですか?
    ↓
 >所々空欄もあります

 なら、下から最終行を探ってください。

 >For i = 1 To Range("J4").End(xlDown).Row 
      ↓            ↓ 
   For i = 4 To Range("J50000").End(xlUp).Row 

(半平太) 2018/08/02(木) 18:55


マナさん返信ありがとうございます。それは区切り位置でdate判定になるということでしょうか?
というのもdate化させた後もvbaでオートフィルタで○○○○/○○/○○~○○○○/○○/○○までフィルタ化をしたいのでdate判定にならないとそれができない?ようです。
それに関してはこのサイトで見つけました。
Dim m, n As Date
  m = Application.InputBox(prompt:="開始年月日は?(yyyy/mm/dd) ", Type:=1)
  n = Application.InputBox(prompt:="最終年月日は?(yyyy/mm/dd) ", Type:=1)

Range("A1").AutoFilter Field:=1, _Criteria1:=">=" & m,_
Criteria2:="<=”n,_
Operator:=xlAnd 
(こっこ) 2018/08/02(木) 18:57


皆さん返信ありがとうございます。空白の欄は先にフィルターで非表示にしてからいただいた構文を入れたほうがいいですかね・・?
Range("j3").AutoFilter _
Field:=10, Criteria1:="="

 Dim i As Long, oug As String
    With ThisWorkbook.Sheets("Sheet1")
        For i = 4 To .Range("J4").End(xlDown).Row
            oug = .Cells(i, "J").Value
            If Len(oug) = 8 Then
                .Cells(i, "J") = Format(DateSerial(Left(oug, 4), Mid(oug, 5, 2), Right(oug, 2)), "YYYY/MM/DD")
            End If
        Next i
    End With
Dim m, n As Date 
  m = Application.InputBox(prompt:="開始年月日は?(yyyy/mm/dd) ", Type:=1) 
  n = Application.InputBox(prompt:="最終年月日は?(yyyy/mm/dd) ", Type:=1) 
Range("A1").AutoFilter Field:=1, _Criteria1:=">=" & m,_ 
Criteria2:="<=”n,_ 
Operator:=xlAnd 
End Sub
(こっこ) 2018/08/02(木) 19:02

>空白の欄は先にフィルターで非表示にしてからいただいた構文を入れたほうがいいですかね・・?

駄目です。半平太さんの回答を参考にするとよいです。

'------
>Range("A1").AutoFilter Field:=1, _Criteria1:=">=" & m,_

これも駄目です。
オートフィルタのデータ範囲を明確に指定してください。
面倒ならJ3:J5000でもよいです。

'------
>それは区切り位置でdate判定になるということでしょうか?

J列を選んで、「区切り位置」実行してみてください。
https://www.becoolusers.com/excel/8-digit-number.html
マクロでも1行コードですが、手作業でも30秒も掛かりません。

ところで、日付に変換する作業は
1回実行するだけでよいのでは?
オートフィルタ実行のたびに必要なのですか。

オートフィルタも開始日と終了日の入力させるなら
手作業でも手間変わらないのでは?

(マナ) 2018/08/02(木) 20:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.