🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

603閲覧

アクティブセルを元号年月日に置き換えたいです。

masatsutsui

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/11/22 02:10

基本的な質問で、失礼します。
化けてしまった年月日の「シリアル値」を元号年月日に変えたいです。
元号から始まる場合は処理をせず、シリアル値であれば、元号年月日に変えセル値を置き換えたいです。
下記の
ActiveCell.Value = ipt 'ここが問題。
で、アクティブセルが「平成 27年 2月26日」に置き換わらないで、シリアル値のままです。
VBAのステップインで次式の「If InStr(1, ipt, "明") = 1 Or ・・・」に処理が移ったところで上式の値を見ると、
左辺が38683のシリアル値、右辺がFormat(ipt, "ggge年mm月dd日")で変換された平成17年11月27日になっています。
「38683」が「平成17年11月27日」に置き換わるはずなのに変わっていません。
よろしくお願いします。

Sub Macro1()
Dim ipt As String

'年月日を取得し、(1860/6/19)等を削除(旧暦の処理)
Range("F1").Select
新件数 = 10
ActiveCell.Offset(新件数 + 1, 0).Range("A1").Select

For 行 = 新件数 + 1 To 2 Step -1
ActiveCell.Offset(-1, 0).Range("A1").Select
ipt = ActiveCell.Value
'
If ipt = "" Then GoTo 99
If InStr(1, ipt, "明") = 1 Or InStr(1, ipt, "大") = 1 Or InStr(1, ipt, "昭") = 1 Or InStr(1, ipt, "平") = 1 Or InStr(1, ipt, "令") = 1 Then GoTo 99

' 年月日の「シリアル値」を元号年月日に変える   2020/11/21 変更

ipt = Format(ipt, "ggge年mm月dd日") ActiveCell.Value = ipt 'ここが問題。アクティブセルが「平成 27年 2月26日」に置き換わらない。 If InStr(1, ipt, "明") = 1 Or InStr(1, ipt, "大") = 1 Or InStr(1, ipt, "昭") = 1 Or InStr(1, ipt, "平") = 1 Or InStr(1, ipt, "令") = 1 Then GoTo 99 Else End If

99 Next 行

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/11/22 02:38 編集

シートがどのような内容になっているのか示してください。 また、コードもコードブロックで括って下さい。
masatsutsui

2020/11/22 02:41

ありがとうございます。シートの内容とは? 何を調べて提供すればいいですか?
sazi

2020/11/22 02:56 編集

そのマクロでアクセスしているシートの初期のデータ状態です。(キャプチャーで良いです) コードからセルの場所と値を推測するのは面倒です。
masatsutsui

2020/11/22 04:08

解消しました。ありがとうございました。 変更対象のセルを文字列書式にしたいことを初めに述べるべきでした。
guest

回答2

0

ベストアンサー

化けてしまった年月日の「シリアル値」を元号年月日に変えたいです。

シリアル値がそのまま表示されているなら、そのセルの書式が標準になっています。

VBA

1If InStr(1, ipt, "明") = 1 Or InStr(1, ipt, "大") = 1 Or InStr(1, ipt, "昭") = 1 Or InStr(1, ipt, "平") = 1 Or InStr(1, ipt, "令") = 1 Then GoTo 99

上記判定が問題無いということは、変更対象外のセルは文字列書式という事ですので、統一するにはそのセルの書式を文字列に変更して下さい。

VBA

1ActiveCell.NumberFormatLocal = "@" 2ActiveCell.Value = ipt

投稿2020/11/22 03:05

編集2020/11/22 03:21
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずは、シリアル値とはなにか、エクセルは日付をどのように管理しているかを理解しましょう。

エクセルのシリアル値とは?日付管理の仕組みを理解しよう

表示されているものとセルに実際に格納されている値は異なるということです。

逆にセルに日付と解釈できる値を入力すると自動でシリアル値に変換されて格納されます。
例えばセルに「令和2年11月22日」と入力してから、イミディエイトウィンドウで、

?CLng(ActiveCell.value)

と入力してEnterキーを押してみてください。
44157
とシリアル値が表示されます。

それが理解できたら、やりたいことは、
セルの日付の表示を和暦表示にしたいのか、
セルの値自体を日付ではなく和暦の文字列にしたいのか、
どちらなのか明確にしましょう。

エクセル上では日付はシリアル値のままの方が扱いやすいし、日付を文字列に変換することにメリットはありません。

ということで、シリアル値のまま書式設定で和暦表示にするのがお勧めです。
VBAでは下記の1行のコードで可能です。

vba

1ActiveCell.NumberFormatLocal = "ggge年m月d日"

日付形式(シリアル値)で格納しておくと、

?ActiveCell.Value '標準の日付書式 2020/11/22 ?CLng(ActiveCell.Value) 'シリアル値 44157 ?CLng(ActiveCell.Value) '表示されている書式 令和2年11月22日

と自由に値を取り出せますし、
並べ変えたり、経過日数を計算したりもできます。

書式を文字列にしてしまうとそれができなくなります。

投稿2020/11/22 03:00

編集2020/11/22 03:29
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masatsutsui

2020/11/22 04:04

上のsazさんiのやり方で解消しました。ありがとうございました。 貴方の方法でもこの時点で上手くいったのですが、後の処理でシリアルになったようでした。 変更対象のセルを文字列書式にしたいことを初めに述べるべきでした。 ありがとうございました。
masatsutsui

2020/11/22 04:11

sajiさんのやり方で解消しました。ありがとうございました。 次の処理でまたシリアル値になってしまいました。変更対象のセルを文字列書式にしたいことを初めに述べるべきでした。
hatena19

2020/11/22 04:13

日付を扱うときに日付書式(シリアル値)がいいのか、文字列書式でいいのかの検討は十分された方がいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問