[[20150614103106]] 『マクロ記録と結果が異なるのは?』(こまった) ページの最後に飛ぶ

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

 

『マクロ記録と結果が異なるのは?』(こまった)

 まだまだ勉強中のため、マクロ記録を参考に書いています。

マクロ記録時、行った結果とマクロを動かした際の結果が異なる事象に
当たりました。
何度考えても不明のため、質問させてもらいました。

やりたいことは抜出した日付データの経過日数を計算したいと思っています。

あるデータを抜出した結果が
12.08.05となります。
※データ上、.(ドット)形式となり、この点は変更できません…。

そこで、マクロ記録を使ってyyyy/mm/dd形式に使用としました。

Sub Macro4()

    Columns("V:V").Select
    Range("V55").Activate
    Selection.Copy
    Columns("U:U").Select
    Range("U55").Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Application.CutCopyMode = False
End Sub

マクロ記録時は先のデータの結果
12/08/05となりました。
しかし、再度マクロを実行した際、
結果が2025/12/8となります。

最終的に経過日付の比較をしたいのですが、.(ドット)のままだと計算ができないめ、
ある意味強引に.(ドット)→/(スラッシュ)に置き換えています。

またその結果を
=DATE(YEAR(U90), MONTH(U90), DAY(U90))
でyyyy/mm/dd形式としています。

この関数がいるのか?と思ったのですが、例えば抽出データが
13.03.27の場合、マクロを実行すると
13/03/27となります。

もう悔しいくらい分かりません。

どなたか、この動きでの原因が分かる方、教えてください。
よろしくお願いします。

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


 U90 はセルアドレスですか? 変数ですか?
 日付の12は平成ですか? 2012年ですか?

 このあたりを整理して、意図した内容に調整出来ればできそうだと思います。
 それからU列と、V列のあたりをもう少し説明できるでしょうか。
 U55 と U90 の関連がちょっとわかりません。

(Mook) 2015/06/14(日) 11:26


Mook様

説明不足、ご指摘ありがとうございます。
自分なりに書いているつもりですが…。
もう少し考えて書くようにします。

U90 はセルアドレスですか? 変数ですか?  U90はセル番地となります。
 V列にある抽出したデータ「12.08.05」を一旦
 U列にコピーし、書式を「12/08/05」に変更しています。
 最後に
 =DATE(YEAR(U90), MONTH(U90), DAY(U90)) で
 「2012/08/05」に変更しています。
日付の12は平成ですか? 2012年ですか?  よって、日付の12は2012を意味しています。

それからU列と、V列のあたりをもう少し説明できるでしょうか。  V列は他より持ってきたデータが入っています。
 それをU列で書式を変更している…。
 分かる方はそんな動きはしない…かもしれませんが。

U55 と U90 の関連がちょっとわかりません。  すいません、U55はマクロ記録でU列を掴んでコピー貼り付けする際
 自動記述されていました。
 U90は今回の説明する際の関数が入っている箇所をコピーした為
 U55・U90では関連はないかと思います。

分からないので、ある意味強引にコピーや書式変更マクロとか入れていますが
日付の
「12.08.05」を「2012/08/05」に書式変更できるのが希望なんです。
ややこしくし、すいません。

(こまった) 2015/06/14(日) 12:00


 うーん、どれだけのデータをどう処理したいかがまだよくわかりませんが、
 U1:U90 に YY.MM.DD という日付が並んでいて、それを隣の V 列に日付にする例です。

 Sub Sample()
    With Range("U1:U90").Offset(0, 1)
        .FormulaR1C1 = "=(""20""&SUBSTITUTE(RC[-1],""."",""/""))*1"
        .Value = .Value
        .NumberFormatLocal = "YYYY/MM/DD"
    End With
 End Sub

 参考になるでしょうか。

(Mook) 2015/06/14(日) 12:18


もう少し、説明が足りていませんでした。

V列に他よりデータ収集してきた日付がつらつらと羅列しています。

(例)
セルV
12.04.29
15.05.11
12.03.14
13.04.09
13.04.09
11.04.29
  ・
  ・
  ・
その中で最古・最新をMIN/MAXの関数で計算する際、
.(ドット)表記ではダメだったのでこのように強引な変更を取り入れました。
(こまった) 2015/06/14(日) 12:43


Mook様

 早速の回答ありがとうございます。

教えていただいたマクロ、入れて試してみます。

ちなみに
セルV列のデータが(今後有り得るかもしれない)飛び飛びに出てくる場合、
最終データまで取得って可能なのでしょうか?

a = Cells(Rows.Count, "V").End(xlUp).Row
で最終行は分かるのですが仮に
セルV
12.04.29

15.05.11
12.03.14

13.04.09

13.04.09
11.04.29
  ・
  ・
  ・
とかなった場合。

元々の依頼ではないので、自分でもトライしてみます。

(こまった) 2015/06/14(日) 12:51


また漏れていましてすいません。

データ的には約300件前後で足りるかと思っています。

すいません。
(こまった) 2015/06/14(日) 12:54


Mook様

 色々検討したのですが、
 12.08.05の場合、マクロ実行後
 7488/5/29とありえない結果に。

ただ、Mook様の教えていただいたマクロ内の「SUBSTITUTE」
これは使えると単純に隣のセルに当てはめると上手くいきました。

12.08.05
=SUBSTITUTE(V122,".","/")
⇒12/08/05

マクロ内を少し読めるようになったのはうれしかったですが
まだまだ知らないことが多いことを痛感しました。

直接的原因は正直分かりませんが、
とりあえずこれでやってみます。

色々アドバイスいただきありがとうございます。
またお願いすることが(必ず?)ありますのでよろしくお願いします。

助かりました。
(こまった) 2015/06/14(日) 13:43


 >7488/5/29とありえない結果に。 
 これは、もともとのデータが日付であるときに、そうなると思います。

 表示          シリアル値
    12/08/05 →   41126
 (2012/08/05)

  7488/5/29  ← 2041126

 見た目ではなく、データで判断する必要があると思います。
 上記のマクロが正しく動くのは、変換元データが YY.MM.DDという形の文字列の時だけで、
 これが日付が入っていて、書式で YY.MM.DD と表示されている場合は、上のようなことに
 なります。

 蛇足ですが、
 >またその結果を
 >=DATE(YEAR(U90), MONTH(U90), DAY(U90))
 >でyyyy/mm/dd形式としています。 
 はちょっと冗長のように感じます。

 YEAR(U90) は U90 が日付と認識できる形であることが前提なので、これが動くのであれば
 =DATEVALUE(U90)
 だけで良いかと思います。

 蛇足2ですが、書式とデータを区別して説明すると良いかと思います。
 >「12.08.05」を「2012/08/05」に書式変更できるのが希望なんです。 
 は書式変更 ではなくて、文字列から日付へのデータの変換と書かれた方が意図が正確に
 伝わる気がしました。

(Mook) 2015/06/14(日) 14:57


 ちなみに、日付データが文字列ではなく
 >これが日付が入っていて、書式で YY.MM.DD と表示されている場合は
 であれば、そのまま MAX、MIN 関数が適用できます。

(Mook) 2015/06/14(日) 15:08


コメント返信:

[ 一覧(最新更新順) ]


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