プロが教える店舗&オフィスのセキュリティ対策術

必要に迫られ数週間前からVBAの勉強をはじめた初心者です。
以下の内容についてご教示ください。

複数使用しているシートの中の“sheet1”のA列に“yy-mm-dd hh:mm:ss”という形で日付が300行ほど入力されています。セルの書式設定を使わずVBAのみで
 ・A列に入力がある場合、B列は“yy年mm月”と表示
 ・A列に入力がない場合、B列は空白セル
 ・A列の日付は定期的に追加されるので、「マクロの実行」を押すだけで随時B列へ適応
  (日付データは最終的に5000件ぐらいになる予定なので、列ごとまとめて設定)
の方法を教えてください。

 |A列          |B列
1|2014-10-07 03:43:31 |2014年10月
2|2014-11-17 15:58:20 |2014年11月
3|2014-12-08 18:22:36 |2014年12月
4|2014-12-08 18:22:37 |2014年12月
5|            |
6|            |
_____________________
[sheet1][sheet_A][sheet_B]…

※書式設定を使えば早いのは承知しておりますが、
マクロを実行で強制的に体裁と整えたいと考えております。

お手数をおかけしますが、宜しくお願いします。

A 回答 (3件)

>B列は“yy年mm月”と表示


は、日付を入れて表示だけ変えるのか
文字列で年と月を表示したいのか
どちらでしょうか。
前者であれば
Columns("B:B").Value = Columns("A:A").Value
Columns("B:B").NumberFormatLocal = "yy年mm月"
と2行くらいで済みそう。

後者であれば
For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
If Range("A" & i).Value <> "" Then
Range("B" & i).Value = Right(Year(Range("A" & i).Value), 2) & "年" & Month(Range("A" & i).Value) & "月"
End If
Next
こんな感じ

・A列の日付は定期的に追加されるので
For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
の部分を
For i = Range("B" & Rows.Count).End(xlUp).Row To Range("A" & Rows.Count).End(xlUp).Row
とかして、負担を減らすなど考えます。
>必要に迫られ数週間前からVBAの勉強をはじめた初心者です。
コードは、ご自身で理解したうえで使ってください。
丸写しで動いたではダメです。
    • good
    • 0
この回答へのお礼

解りやすく例を挙げて頂きありがとうございます。
>コードは、ご自身で理解したうえで使ってください。
丸写しでは思ったように動かない事は数週間で学びました。
参考に勉強させて頂きます。

お礼日時:2015/04/30 21:37

こんにちは。


>※書式設定を使えば早いのは承知しておりますが、
#1の人のコードとはまったく違いますが、Text関数に書式を入れて、マクロで変換する方法もあるのですが、私は、オーソドックスの方がよいと思います。以下でミソになるのは、IsDate と CDate の組合せです。これは、テキストでもあまりここらのことは書かれていませんから、よく研究してみるとよいです。
なぜ、c.TextとText プロパティを使っているのとか、いろいろ換えてみてください。本来、.Valueプロパティでも良いはずです。

'//
Sub MaroTest1()
 '8972565
 Dim sh1 As Worksheet
 Dim c As Range
 Dim dt As Date
 'シートの登録
 Set sh1 = Worksheets("Sheet1")
 With sh1
  '画面のちらつきを止める
  Application.ScreenUpdating = False
  For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp))
   If c.Value <> "" Then
    If IsDate(c.Text) Then
     dt = CDate(c.Text) '文字列を日付に変更
     c.Offset(, 1).Value = Format$(dt, "yy年mm月")
    End If
   End If
  Next c
  Application.ScreenUpdating = True
 End With
 Set sh1 = Nothing
End Sub
'///
    • good
    • 0
この回答へのお礼

新たな方法として例を挙げて頂きありがとうございます。
自分でも模索しながら勉強させて頂きます

お礼日時:2015/04/30 21:33

Format関数で整えて代入


(例1)
With Range("A1")
.Offset(, 1).value = Format(.value, "yyyy""年""mm""月"";@")
End With

コピーとセル書式設定の例
(例2)
With Range("A1")
.Copy .Offset(, 1)
.Offset(, 1).NumberFormatLocal = "yyyy""年""mm""月"";@"
End With

値代入とセル書式設定の例
(例3)
With Range("A1")
.Offset(, 1).Value = .Value
.Offset(, 1).NumberFormatLocal = "yyyy""年""mm""月"";@"
End With

処理対象セル範囲を取得する例
(例4)
Dim rng As Range

With Cells(Rows.Count, "B").End(xlUp)
If .ROW = 1 Then
Set rng = .Offset(, -1)
Else
Set rng = .Offset(1, -1)
End If
End With
Set rng = Range(Cells(Rows.Count, "A").End(xlUp), rng)

With rng
.Offset(, 1).Value = .Value
.Offset(, 1).NumberFormatLocal = "yyyy""年""mm""月"";@"
End With
    • good
    • 0
この回答へのお礼

例を挙げながら解説頂きありがとうございます。
まだ、私の頭がついていってない所が多く有ります。
参考に勉強させて頂きます。

お礼日時:2015/04/30 21:31

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A