[[20110826144934]] 『西暦から和暦変換VBAについて』(フェンダー) ページの最後に飛ぶ

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

 

『西暦から和暦変換VBAについて』(フェンダー)

 関数で値を求めると、元データを削除した際求めた値が非表示になってしまいます。

 例えばAセルに
 1989/11/16
 1989/3/2
 1989/2/17
 1989/7/5
 1989/11/1
 と入力されてたとします。

 Sub test()

    Range("B1").Value = Format$(Range("a1").Value, "ggge年m月d日")
   Range("B2").Value = Format$(Range("a2").Value, "ggge年m月d日")
    Range("B3").Value = Format$(Range("a3").Value, "ggge年m月d日")
    Range("B4").Value = Format$(Range("a4").Value, "ggge年m月d日")
    Range("B5").Value = Format$(Range("a5").Value, "ggge年m月d日")

 End Sub

 上記の記述で

 1989/11/16 平成1年11月16日
 1989/3/2  平成1年3月2日
 1989/2/17  平成1年2月17日
 1989/7/5  平成1年7月5日
 1989/11/1  平成1年11月1日

 と返ってくるのですがA列に入力されているすべてのデータを
 B列にすべて
 求めるにはどのような記述を加えればよいのでしょうか??
 VBA初心者ですので、構造自体がまだよくわからない状態です。
 なにかヒントやアドバイス頂けると助かります。
 どうぞよろしくお願いします。

 XP(2007) 7(2010)  (フェンダー)


 他にもいろいろ書き方はあるけど、もっとも基本的なループ処理のパターン。
データが入っている最終行を求めておいて、処理する行を変数にして、それを 1 から 最終行 までループさせる。

 Sub test()
    Dim 最終行 As Long
    Dim i As Long

    最終行 = Range("A" & Rows.Count).End(xlUp).Row 'Rows.COunt は 2003 では 65536
    For i = 1 To 最終行
        Range("B" & i).Value = Format$(Range("A" & i).Value, "ggge年m月d日")
    Next

 End Sub

 (ぶらっと)

 ではループなしで。
 
With Range("A1", Range("A" & Rows.Count).End(xlUp))
    .Offset(, 1).Value = Evaluate("IF(" & .Address & "="""","""",TEXT(" & .Address & ",""gggge年m月d日""))")
End With
 
(ROUGE)

 もう一案。
区切り位置を使う方法。
 
Columns(1).TextToColumns Destination:=Range("B1")
Columns(2).NumberFormatLocal = "[$-411]ggge""年""m""月""d""日"";@"
 
(ROUGE)


 Sub こんなのも()
    Columns("B").Value = Columns("A").Value
    Columns("B").NumberFormatLocal = "[$-411]ggge""年""m""月""d""日"";@"
 End Sub

 (ぶらっと)


 ↑
確かに!
(ROUGE) 

 いろいろでますね〜。
 
With Range("A1", Range("A" & Rows.Count).End(xlUp))
    .AutoFill Destination:=.Resize(, 2), Type:=xlFillCopy
    .Offset(, 1).NumberFormatLocal = "[$-411]ggge""年""m""月""d""日"";@"
End With
 
(ROUGE)

 どうもありがとうございます。
 色々な提案勉強になります。
 ちなみに、下記のように
 3フィールドに分かれているデータを
 西暦から和暦に変換できるマクロはどのように
 なりますでしょうか??
 色々試してるのですが
 1年を元年に置換することも出来ません。
 アドバイスお願いします。
 (A1)1989  (B1)1  (C1)7
 (A2) 1989   (B2)1   (C 2)8

     ↓
                  
 昭和64年1月7日
 平成元年年1月8日

 XP(2007) 7(2010)  (フェンダー)


 マクロなんか、試行錯誤しないと出来る様に成らないと思いますよ。

 まずはどうなっていれば良いのか考えてみてはどうでしょう?
 全体的に「わからない」ではなく
 一番最初にクリアしたい所(現在ネックになっている所)は?

 また、ワークシート上ではどうやってやろうと思いますか?

 同じ事をVBA内でやろうと思ったら、どの様に書けばよいのか
 探してみると良いと思います。

 (HANA)

 アドバイスありがとうございます。
 なんかこれでは答えを出してもらってるだけで
 なかなか覚えられないですね。
 あと答えを提案してくれるのは助かるですが、
 このマクロは
 この記述だからこう動いて
 置換するにはこれが
 ポイントですよなど
 アドバイスがあれば勉強になったのですが
 みなさんのご回答は非常にありがたかったです。
 因みに冒頭に初心者で構造自体分からない
 状態なのでなにかヒントやアドバイス頂けると助かります。
 とお知らせしてから記述してますので。
 あとマクロがある程度出来るので
 あればシートに記述して質問してますし、
 自分で試行錯誤してると思います。
 まだ具体的に質問出来る段階ではないようです。

 (フェンダー)


 >また、ワークシート上ではどうやってやろうと思いますか?
 これは、マクロから離れた質問です。
 フェンダーさんは別スレで回答も貰っているので、答えられるはずですけどね?

 それから
 >一番最初にクリアしたい所(現在ネックになっている所)は?
 に関しては、これまでの質問で「1989/11/16」が与えられていれば
 平成1年11月16日の状態までは出来る様に成っていますので
 現在ネックになっているのは
  年を表す1989,月を表す11,日を表す16から「1989/11/16」と言う日付にする点
 じゃないかと思うのですが、違うのですか?

 考えてみてください と言ったのは
   1989,11,16 の三つの値から「1989/11/19」にする方法
 ではなく、
  何がネックになっているか?
 ですから、これまた VBAの知識がどう とか言う問題では無いですね。

 自分が躓いている所が分かれば、それに関して情報を集める事が出来ます。
 集めた情報で一つ問題がクリアできれば、解決に一歩近づきます。
   たとえ遠回りの道だったとしても。

 自分が躓いている所が分からなければ、情報を集める事も出来ませんので
 前に進む事も出来ません。

 因みに冒頭に初心者で構造自体分からないと書いてありますので
 こちらから質問をしています。

 なお、こう言った掲示板では
 > このマクロはこの記述だからこう動いて
 > 置換するにはこれがポイントですよなど
 > アドバイスがあれば勉強になったのですが
 これは、ご自身がコードを良く読んで、色々調べて分かる努力をした後に
 「ここがどうなっているのかどうしても分からないのだけど。。。」
 と質問すべき事だと思います。
 そろそろ与えられる勉強から脱却されてはどうでしょう。

 まぁ、まずはご自身で手の届く範囲から初めてみられては?
 元データはリストに成っていると思いますので
 このコードはVBAの知識が無くても出来ると思いますよ。

 少し段取りを考える必要があるとは思いますが、マクロの記録で。
https://www.excel.studio-kazu.jp/lib/e4b/e4b.html

 (HANA)

 マクロの記録なんて物じゃなく、考えながらコードを書くことにすると。。。

 たとえば、前スレでGobGobさんが載せてくれている元年表示の式
=SUBSTITUTE(SUBSTITUTE(TEXT(DATE(A1,B1,C1),"ggg e年m月d日")," 1年","元年")," ",)

 DATE関数で A1年B1月C1日 をシリアル値に変換・・・DATE(A1,B1,C1)
 TEXT関数で その日付を "ggg e年m月d日" の形に変換・・・TEXT(・・・,"ggg e年m月d日")
 SUBSTITUTE関数で " 1年" を "元年" に置換・・・SUBSTITUTE(・・・," 1年","元年")
 さらに、SUBSTITUTE関数で " "を削除・・・SUBSTITUTE(・・・," ",)

 これがなんとかコードの方に載せられれば良いですね。

 TEXT(シリアル値,"ggg e年m月d日")
 の部分は、載せておられる様に
    Format$(Range("a1").Value, "ggge年m月d日")
 TEXT → FORMAT に置き換えられますのでまずは簡単に、分かるところを近づけます。
    Format$(Range("a1").Value, "ggg e年m月d日") 
                                   ~ここに半角スペースを一つ。

 SUBSTITUTE関数に変わるものは、とりあえずヘルプで「置換」を調べます。
 関係有りそうなページを片っ端から開いて確認してみてください。
 すると Replace 関数 が
  機能
   指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返します。
 と成っているので、これが同じ様に使えそうです。

 しかも、構文を確認すると
 Replace(expression, find, replace[, start[, count[, compare]]])
    expression  必ず指定します。置換する文字列を含む文字列式 を指定します。 
    find        必ず指定します。検索する文字列を指定します。 
    replace     必ず指定します。置換する文字列を指定します。
 その他の引数は省略可能と書いてあります。

 指定方法は、SUBSTITUTE関数と同じ様です。
 なので
=Replace(Replace(Format$(Range("a1").Value, "ggg e年m月d日")," 1年","元年")," ",) 
 単純に置き換えるとこうなりますが、これをVBAの方に持っていって
 Range("B1").Value = Replace(Replace(Format$(Range("a1").Value, "ggg e年m月d日"), " 1年", "元年"), " ",)
 とすると、『コンパイルエラー: 修正候補:式』とエラーメッセージが出ます。

 一番外側の Replace関数が、
  expression  Replace(Format$(Range("a1").Value, "ggg e年m月d日"), " 1年", "元年")
   find        " "
   replace     ★ここに何も指定がない★
 になっていますので。

 関数でも、B1セルに =IF(A1="","",A1) なんて式をかいて
 A1に入力が無い場合 A1には何も表示されませんね。
 VBAでも同じ様にやってみて、許してもらえるか動かして確認してみましょう。
 Range("B1").Value = Replace(Replace(Format$(Range("a1").Value, "ggg e年m月d日"), " 1年", "元年"), " ", "")

 思った結果が出れば あとは、Range("A1").Value の所が問題として残っていますので
 これを解決しないといけません。

 日付に関する事なので、ヘルプで「日付」を調べてみます。
 『日付と時刻に関するキーワード一覧』が有ったら、確認してみてください。
 Replace関数を見つけた時の様に、片っ端から確認してもらっても良いかもしれません。

 それから、Web検索も良いと思います。
 検索ワードは「エクセル VBA 年 月 日 日付」あたりでやってみてください。

 1行目に対するコードが出来たら、今度は ぶらっとさんが最初に載せてくださっているコードを見ながら
 同じ様に修正すると、A列に入力されているすべてのデータを処理できる様になると思います。

 まずは情報収集、やってみてください。
 で、「色々やったけど駄目だった」ではなく
 「こんな情報を見つけたから こうやってみたけど このように駄目だった」と
 書いてみてください。

 フェンダーさんが躓いている部分が分かれば
 より状況にあったアドバイスがもらえると思います。

 (HANA)

 アドバイス丁寧にどうもありがとうございます。

 >これは、ご自身がコードを良く読んで、色々調べて分かる努力をした後に
 「ここがどうなっているのかどうしても分からないのだけど。。。」
 と質問すべき事だと思います。

 こちらはアドバイスいただいているほうで
 頭が下がる思いですが
 回答を投稿してくれる方は
 具体的に質問してくれたほうが
 回答しやすいとは思います。
 現在ネックになっている情報に関して
 足りなかったのは、申し訳なかったです。

 そもそも質問ボードに初心者は質問してはいけないのか
 ある程度勉強して知識がある状態から質問してくださいとの
 ことでしたら前回記述しました
 まだ具体的に質問出来る段階ではないようです。
 で合っていると思います。

 とりあえず上記のアドバイス通りヘルプなど
 活用していったん整理して、
(時間がかかると思いますが)ご報告したいと思います。
 どうありがとうございました。

 (フェンダー)


 結果は文字列でよいのですよね?
 このようなコードでしたら解読できませんか?  (Hatch)
Sub fender()
    Dim i As Long
    Dim 最終行 As Long
    Dim 日付 As Date
    最終行 = 10
    For i = 1 To 最終行
        日付 = Range("A" & i).Value & "/" & Range("B" & i).Value & "/" & Range("C" & i).Value
        If Format$(日付, "ggge年") = "平成1年" Then
            Range("D" & i).Value = "'平成元年" & Format$(日付, "m月d日")
        Else
            Range("D" & i).Value = "'" & Format$(日付, "ggge年m月d日")
        End If
    Next i
End Sub
もしくは、DateSerialでシリアル値にして、昭和元年も考慮するなら
Sub fender2()
    Dim i As Long
    Dim 最終行 As Long
    Dim 日付 As Date
    最終行 = 10
    For i = 1 To 最終行
        日付 = DateSerial(Range("A" & i).Value, Range("B" & i).Value, Range("C" & i).Value)
        If Format$(日付, "e年") = "1年" Then
            Range("D" & i).Value = "'" & Format$(日付, "ggg") & "元年" & Format$(日付, "m月d日")
        Else
            Range("D" & i).Value = "'" & Format$(日付, "ggge年m月d日")
        End If
    Next i
End Sub

 >そもそも質問ボードに初心者は質問してはいけないのか
 そんな事はないです。

 ただ、初心者とは言え
 書いてもらったコードに関して理解する努力が必要だと思いますし
 たとえそれが実らなくても【思考する】事も大切だと思います。

 >回答を投稿してくれる方は具体的に質問してくれたほうが回答しやすいとは思います。
 まぁ、それはそうですが 基本的にコードを考えるだけなら
 フェンダーさんの書いておられる質問は ほぼ充分な質問に成っていると思います。

 (HANA)

 前に書いたものを若干修正してみました。
 元になる数式はこのようなものです。
=IF(TEXT(DATE(A1,B1,C1),"e")="1",TEXT(DATE(A1,B1,C1),"ggg元年m月d日"),TEXT(DATE(A1,B1,C1),"ggge年m月d日"))

 これをコードにすると
Sub fender3()
    Dim i As Long
    Dim 最終行 As Long
    Dim 日付 As Date
    最終行 = 10
    For i = 1 To 最終行
        日付 = DateSerial(Range("A" & i).Value, Range("B" & i).Value, Range("C" & i).Value)
        If Format$(日付, "e") = "1" Then
            Range("F" & i).Value = "'" & Format$(日付, "ggg元年m月d日")
        Else
            Range("F" & i).Value = "'" & Format$(日付, "ggge年m月d日")
        End If
    Next i
End Sub
といった感じになります。
 日付のシリアル値は、VBAではDateSerialを使います。
 (VBAではDateは今日の日付になりますので使えません。)
 あと、「元年」は表示形式の「e」で「1」のときとすればよいと考えたものです。

 HANAさんが丁寧に回答されているので、気が引けているのですが
 このような考え方もできるということで書き込ませていただいています。
   (Hatch)

 返信遅くなりました。
 私が困っていた部分がそのまま答えに出ています。
 仕事で急いでいたので助かります。

 日付 = DateSerial(Range("A" & i).Value, Range("B" & i).Value, Range("C" & i).Value)

 上記の記述に対して
 日付のシリアル値は、VBAではDateSerialを使用するとのことですが
 セル範囲を表すRangeに対して文字を入力・値を取得するValueの&iは
 なぜ
 For i = 1 To 最終行(この部分です)の
 ように表すのでしょうか?
 件数に対して最終行 = 10の数値を変更すれば良いと思うのですが・・

 初心者のご質問ですいません。

 (フェンダー)

 A1:C1だけの処理ではないのでしょう?
 何行にもわたってこの処理を繰り返したいのだと思って、このようなループ処理にしました。
  (ぶらっと)さんが書いていた
最終行 = Range("A" & Rows.Count).End(xlUp).Row 'Rows.COunt は 2003 では 65536
でよいのですが、分かりやすくするために10行目までと仮定して、最終行 = 10としました。

 日付 = DateSerial(Cells(i,1).Value, Cells(i,2).Value, Cells(i,3).Value)
の方がわかりやすかったですか?
 Range("A1").Value と Cells(1,1).Value は同じで A1セルの値になります。
 Range("A1").Value を  Range("A" & 1).Value と書くことができますので、
 ループするために Range("A" & i).Value としたものです。
   (Hatch)

 お世話になります。

 For i = 1 To の表す1は("A1")のことなので
 ("A" &1)のままでは、ループ処理できないので
 ("A" & i)にするという事で
 よろしいですか?
 A1:C1だけの処理ではないのですが
 iを記述する意味がよくわからなかったのです。

(フェンダー)


 > For i = 1 To の表す1は("A1")のことなので
 
「i」と言う変数を1からスタートさせます、って意味でしかありません。
「A1」の事になるのかどうかは、そのあとに続くマクロでどう扱ったかによります。
今回の場合は、A1って意味にも使ってるし、B1、C1って意味にもなってると言えるか知れません。
 
何か疑問と感じたら、その疑問のままにコードを書き換えて試してみると良いですよ。
ファイルが壊れたら困る場合は、バックアップを取ってから。
 
ためしにFor〜Nextの中の「i」を代わりに「1」として書き換えました。
Sub fender3_test_1()
    Dim i As Long
    Dim 最終行 As Long
    Dim 日付 As Date
    最終行 = 10
    For i = 1 To 最終行
        日付 = DateSerial(Range("A" & 1).Value, Range("B" & 1).Value, Range("C" & 1).Value)
        If Format$(日付, "e") = "1" Then
            Range("F" & 1).Value = "'" & Format$(日付, "ggg元年m月d日")
        Else
            Range("F" & 1).Value = "'" & Format$(日付, "ggge年m月d日")
        End If
    Next i
End Sub
 
結果は期待する物でしたか?
そうではないはずです。

 もし「For〜Next」のループがよく解らないなら、
その簡単な例を、試しに自分で書いてみようと考える。
 
'「1」を使ったパターン
Sub test1()
    Dim i As Long
    Dim 最終行 As Long
    最終行 = 10
    For i = 1 To 最終行
        MsgBox Range("A" & 1).Value
    Next
End Sub
 
'「i」を使ったパターン
Sub test2()
    Dim i As Long
    Dim 最終行 As Long
    最終行 = 10
    For i = 1 To 最終行
        MsgBox Range("A" & i).Value
    Next
End Sub
 
上記どちらも10回メッセージボックスが表示されます。
test1では「A1」の内容が10回繰り返し表示され、
test2では「A1〜A10」の中身が1回ずつ表示されます。

 と、ひょっとして「i」って表記が「I列」と紛らわしくて混乱してます?
「i」はFor〜Nextループ処理等でよく使われている、ただの変数名にすぎません。
だから例えば、「i」の代わりに以下の様にも書けます。
 
Sub test3()
    Dim rowpos As Long '変数名を「i」から「rowpos」に変えた。RowPositionの略のつもり。意味が分かりやすいように適当につけた。
    Dim 最終行 As Long
    最終行 = 10
    For rowpos = 1 To 最終行
        MsgBox "A" & rowpos & "のデータは" & Range("A" & rowpos).Value
    Next
End Sub
 
もし「"A" & rowpos」と書かずに「"A" & 1」と書いたらどうなるか、
それはご自身で確かめてみてください。

 で、ここまで私が書いた内容で不明な単語はありませんでしたか?
例えば「変数」って何?とか。
 
ちと後のフォローが出来ないかも知れませんが、一応以上、参考まで。
(ご近所PG)

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

 理解できました。
 記述して頂いたマクロを検証させていただきました。
 Dim 変数・配列を利用する名前をiにしてたという事ですね。
 i列と紛らわしかったというのもありますが、
 なぜ変数名にiを用いていたのかもわからなかったのです。
 それに対して、For_Nextで繰り返し処理に変数名iで
 ループさせていたという事ですね。

 Sub fender3()
     Dim rowpos As Long
     Dim 最終行 As Long
     Dim 日付 As Date
     最終行 = 10
     For rowpos = 1 To 最終行
         日付 = DateSerial(Range("H" & rowpos).Value, Range("I" & rowpos).Value, Range("J" & rowpos).Value)
         If Format$(日付, "e") = "1" Then
             Range("G" & rowpos).Value = "'" & Format$(日付, "ggg元年m月d日")
         Else
             Range("G" & rowpos).Value = "'" & Format$(日付, "ggge年m月d日")
         End If
     Next rowpos
 End Sub
 上記のように変更して検証してみました。

 わかりやすく解説頂いて勉強になりました。

(フェンダー)


 理解が深まったなら良かった。
 
ちょっと蛇足的なお話ですが、
『For〜Nextの変数名に「i」を使う事が多い』のにはちょっとした訳があります。
プログラミングの歴史をすこし遡ると、その理由が見えてきます。
 
参考URL
第5回 JavaScriptで繰り返し処理をしてみよう!
http://www.atmarkit.co.jp/fcoding/articles/js/05/js05a.html
 
記事そのものは特に気にしないでいいんで、このページ中ほどの
『●コラム:なぜ変数名に「i」を使うの?』
って部分の読み物だけご覧ください。
 
これはトリビア的なお話なんで、忘れて構いません。
そんな〜時代も〜あぁ〜ったねと〜って感じで。
(ご近所PG)

 Fortranが起源ですか・・・知りませんでした。
 また賢くなったような気がします。サンキューです。
 1975年かぁ。。。。  (Hatch)

 普段何気なく使ってるものの由来とかが分かると、ちょっと面白いですね。
 
参考URL
Wikipedia FORTRAN
http://ja.wikipedia.org/wiki/FORTRAN
暗黙の型宣言による伝統的・慣習上の変数命名規則の誕生
Iから始まる6文字に決まったのはIntegerの頭文字Iを連想しやすいからと推測される[要出典]。
 
これまたちなみに、先のatmarkitには「iからnで始まる変数〜」とありますが、
これが何故「iからn」なのかというと、
「INteger」の最初の2文字からその範囲を決めた、とかって話もどこかで見たなぁ。
こじつけかも知れませんけどね。
私も現役で使ってたわけじゃなくて後から知っただけなんで
そういうこじつけがどこまで本当かどうかはよく知りません。
あとどうでもいいけどQWERTYキーボードは
「IJKLMN」の6文字が妙に一か所に纏まってたりしますね。
 
WebMasterの部屋を見ると、校長先生は現役バリバリ使ってらしたみたい?ですね。
(ご近所PG)無駄話好き

 (HANA)さんにご報告いたします。

 > あれ?これって↓に続いたのでは?
 >[[20110826144934]] 『西暦から和暦変換VBAについて』(フェンダー) 
 >なら最初からこの様に質問すれば良いのに。

 と前スレで記載されていましたが、これは単に
 関数だと元データを削除すると成り立たなかったので
 改めて別スレからマクロ記述としてご質問しました。
 生成データを別シートにコピー貼り付けの方法もありましたが
 1つのデータ内で作業したほうが安全だと思ったからです。

 今回の質問は2点ほどありました。
 \x{fffd}@1フィールド(1989/1/8)→平成元年1月8日(1年を元年に置換)
 \x{fffd}A3フィールド(1989,1,8)→平成元年1月8日(1年を元年に置換)
 これはお客様から頂くデータが2パターン予想されていたからです。

 先週解説して頂いたように考えながらコードを書くことにすると
 記述が間違っているとエラーメッセージが出ます。
 その際、プログラムをデバックして誤りを探し、
 ヘルプ・検索などで修正を行っていくという方向でやっていきたいと思います。

 >一番外側の Replace関数が、
 >  expression  Replace(Format$(Range("a1").Value, "ggg e年m月d日"), " 1年", "元年")
 >   find        " "
 >   replace     ★ここに何も指定がない★
 > になっていますので。

 上記のような部分は素人だと何が原因かヘルプ・検索を
 しても誤りに気が付かず解決できない部分かもしれません。
 また質問内容も素人な分、説明不足も多々あるかと思いますが
 今後ともよろしくお願いします。

 (フェンダー) 


 ご丁寧に 有り難う御座います。

 最初は何をするにも時間がかかると思いますが、説明文(応答文)からの印象ですと
 フェンダーさんなら すぐにコードが書ける様に成ると思います。
 しかし、誰だってそれについて努力しないとその能力は身に付かないと思います。

 「わざわざここへ来て頭を下げたり、回答が有るまで待ったりしなくても
  ご自身で出来るんだろうに。。。」
 と思ったので、あんな書き込みに成ってしまいました。

 一人でやっていたら、思考が陥ることも有ると思います。
 その場合は多いに質問して頂けると良いと思います。
 事前に悩んでいた分、身に付くと思います。

 ちなみに
 >関数だと元データを削除すると成り立たなかったので
 ですが、値貼り付けして仕舞えば良い事はご存じだったはず。
   その際、別の場所を用意する必要も無いと思います。
 それを マクロの記録にとれば良かったのです。

 小さなサンプルで試してみて下さい。
 	[A]	[B]	[C]	[D]
[1]	年	月	日	年月日
[2]	1989	11	16	
[3]	1989	3	2	
[4]	1989	2	17	
[5]	1989	7	5	
[6]	2011	11	1
[7]	

 ●マクロの記録開始
  1.C2セルを選択
  2.Ctrl + Shift + ↓(C2:C6が選択される)
  3.Ctrl + C (コピー)
  4.D2セルを選択
  5.Ctrl + V (貼り付け)
  6.=SUBSTITUTE(SUBSTITUTE(TEXT(DATE(A2,B2,C2),"ggg e年m月d日")," 1年","元年")," ",)
    の式を入れて、Ctrl + Enter(D2:D6に上記式が入る)
  7.Ctrl + C (コピー)
  8.右クリック→形式を選択して貼り付け(S)→●値(V)
  9.A:C列を選択
  10.右クリック→削除(D)
 ■マクロの記録終了

 8番で数式を値にしているので、A:C列が削除されても大丈夫に成ります。

 そのままでも案件を満たす動きに成ると思います。
   データ量が変わっても、最後のデータまで処理される。
 「不要部分を削除」など手直しをすると、もう少し動きがスムーズに成ると思います。

 VBAが分からなくても出来るマクロも有る。って事を どこかに覚えておいて頂けると
 これから何かの役に立つ事も有ると思います。

 (HANA)

 提案どうもありがとうございます。

 上記のサンプルで対応できました。
 前スレで上記のようなことが可能かご質問したところ
 ご回答がなかったので、こういった方法が
 ないと思い
 改めてマクロでご質問致しました。

 Ctrl + C (コピー)
  8.右クリック→形式を選択して貼り付け(S)→●値(V)
  9.A:C列を選択
  10.右クリック→削除(D)

 上記のような操作手順は初めて覚えた事なので
 しっかりメモをとり今後使用させていただきます。
 ただ今まで提案をしていただいた方々のマクロも
 大変勉強になりましたので
 VBAを覚えていくうえで参考になります。

 またVBAに関しては、ステートメント、メソッド、プロパティ、オブジェクトなどの
 概念を1つずつ理解して
 少しずつでもコードが書けるようになればと思っています。
 どうもありがとうございました。

 (フェンダー) 

コメント返信:

[ 一覧(最新更新順) ]


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