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

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

ただいまの
回答率

90.99%

  • VBA

    1424questions

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

  • Excel

    1227questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 253

pazzu

score 10

入力年月日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桁)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 19: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

    キャンセル

  • 2017/09/07 20:04

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

    キャンセル

  • 2017/09/08 14: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

    キャンセル

  • 2017/09/08 14:38

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

    キャンセル

  • 2017/09/08 16:48

    念のために補足しておくと、小数をMod演算子で演算するときに、整数に丸められますので、注意が必要です。

    Debug.print (2059 \ 10) Mod 10
    結果 5

    Debug.print (2059 / 10) Mod 10
    結果 6

    今回の年月日の場合は、丸めで切り上げはないのでいいのですが。

    キャンセル

  • 2017/09/08 17:28

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

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

'' VBA

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1424questions

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

  • Excel

    1227questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。