質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

Q&A

4回答

219閲覧

数列を年、月、日で区切りたい。

pazzu

総合スコア16

VBA

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

1グッド

0クリップ

投稿2017/09/07 02:51

入力年月日1 = 10000203
入力年月日2 = 20000302

入力年月日1と入力年月日2が上記の数列のとき、下記のように関数を使用せずにプログラミングのみで数字を分けたいのですが、可能でしょうか?ご教授頂けると幸いです。

入力年月日1の年 = 1000(入力年月日1の上4桁)
入力年月日2の年 = 2000(入力年月日2の上4桁)
入力年月日1の月 = 02(入力年月日1の上5から6桁)
入力年月日2の月 = 03(入力年月日2の上5から6桁)
入力年月日1の日付 = 03(入力年月日1の下2桁)
入力年月日2の日付 = 02(入力年月日2の下2桁)

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答4

0

数列 = 数値 であれば、割り算と剰余で年月日の各部分を算出できます。

VBScript

1 Dim v, y, m, d 2 v = 20170907 3 ' hatena19さんのコメントを受けて`\`で商を求めるように 4 y = v \ 10000 5 m = (v \ 100) Mod 100 6 'y = CInt(v / 10000) 7 'm = (v / 100) Mod 100 8 d = v Mod 100 9 MsgBox y & "年" & m & "月" & d & "日"

投稿2017/09/07 03:54

編集2017/09/08 05:36
can110

総合スコア38233

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

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

退会済みユーザー

退会済みユーザー

2017/09/07 10:28 編集

そのままで十分エレガントですが、(v-10000の余り)/10000にすればCIntまで削れてしまいますね。 ' VBA Sub Can100_method_mod() Dim v, y, m, d As Long v = 20170907 y = (v - (v Mod 10000)) / 10000 m = (v / 100) Mod 100 d = v Mod 100 MsgBox y & "年" & m & "月" & d & "日" End Sub
can110

2017/09/07 11:04

その発想はなかったです。なるほど!
hatena19

2017/09/08 05:31

整数除算演算子 \ を使えばもう少しシンプルにできます。 Sub Can100_method_mod() Dim v, y, m, d As Long v = 20170907 y = v \ 10000 m = (v \ 100) Mod 100 d = v Mod 100 MsgBox y & "年" & m & "月" & d & "日" End Sub
can110

2017/09/08 05:38

コメント&情報ありがとうございます。¥演算子で商を求めることができるのですね。 さらにシンプルにできました。回答に反映させていただきました。
hatena19

2017/09/08 07:48

念のために補足しておくと、小数をMod演算子で演算するときに、整数に丸められますので、注意が必要です。 Debug.print (2059 \ 10) Mod 10 結果 5 Debug.print (2059 / 10) Mod 10 結果 6 今回の年月日の場合は、丸めで切り上げはないのでいいのですが。
can110

2017/09/08 08:28

なるほど。 年月日の範囲だと問題ありませんが「20179897」などだと「/」の場合、意図しない結果になりますね。 「\」にて商からModすべきですね。 このあたりの型変換や端数処理の動作は言語により異なるので仕様確認は必要ですね。 補足ありがとうございます。
guest

0

入力年月日1の年 = Mid(入力年月日1, 1, 4) 入力年月日1の月 = Mid(入力年月日1, 5, 2) 入力年月日1の日付 = Mid(入力年月日1, 7, 2)

では、ダメでしょうか?
関数を使用せずプログラミングのみでという意味がわかりませんでした。

投稿2017/09/07 03:19

編集2017/09/07 03:23
koguma98

総合スコア288

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

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

0

関数だけ、とはワークシート関数なのか、四則演算だけなのかわかりませんが、formatを使ってよいならこれでもよいかと。短いですがどこかインチキ感が漂います。

'' VBA Sub test() lng = 10000203 MsgBox Format(lng, "0000-00-00") End Sub

投稿2017/09/07 10:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

関数ではなくメソッドで、ということでしょうか?
関数を避ける理由がいまいち思いつきませんが・・・

8桁固定ならStrings.Mid メソッドでよいかと思います。

VBA

1年 = Strings.Mid(入力年月日, 1, 4) 2月 = Strings.Mid(入力年月日, 5, 2) 3日 = Strings.Mid(入力年月日, 7, 2)

ワークシート関数ではなくVBAで、という意味ならkoguma98さんの回答がよいかと。

補足:
ワークシート関数とVBA関数というものがあり、それぞれ全くの別物です。
文脈で分かることもありますが、呼び分けた方が齟齬がなくて◎。
違いは調べてみてくださいね。

投稿2017/09/07 03:31

編集2017/09/07 03:54
ladybird

総合スコア163

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問