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

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

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

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

Q&A

解決済

2回答

1133閲覧

VBA 2桁の日にちをyyyymmddの8桁に変換する簡易な手法

r_o_234

総合スコア15

VBA

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

0グッド

0クリップ

投稿2020/04/21 01:41

編集2020/04/22 02:38

イメージ説明

前提・実現したいこと

VBAで転換マクロツールを創っています。

いま、抽出元のシートから数値を抽出して、
1,2,3,・・・31(日)と"日にち"が抽出先のシートにyyyymmdd表記でCSVで出力されるようになってます。

 このCSVを別のソフトウェアに読み込ませる為に"20200301","20200302"といった風に"8桁のyyyymmddの年月日表記"まで変換したくおもっております。

この"8桁のyyyymmddの年月日表記"をする為に、別のシート(1)のA7とC7のセルに打った"2020(年)"と"03(月)"という"年月セル"をVBA側で合算する仕様を考えております。

 この手法を調べているのですが、例えば上記合算の方法だと、"8桁のyyyymmddの年月日表記"を組む為に1つのセル当たり5行も使うようなVBAのコードばかりヒットして悩んでいます。
もしもっと簡易なVBAでの表現方法があれば教えてください。

発生している問題・エラーメッセージ

---

該当のソースコード

VBA

1Public Sub FileUpload() 'ファイル選択ダイアログモジュール 2 3 Dim fType As Variant 4 Dim fPath As Variant 5 6'※選択できるファイルの種類はエクセルファイルのみ 7 fType = "Microsoft Excelブック,*.xls?" '※ 8 9'ファイル参照ダイアログの表示 10 fPath = Application.GetOpenFilename(fType, , "") 'fType = fPath。 11 Debug.Print fPath 12 If fPath = False Then 13'ダイアログでキャンセルボタンが押された場合は処理を終了します 14 Exit Sub 'Endで強制終了はよろしくない 15 End If 16 17 Dim Target As Workbook 'コンバートモジュール 18 Set Target = Workbooks.Open(fPath) 19 20 'これをセル抜き出しから数値抜出に変更⇔循環小数エラーの解決。 21 Target.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("A2") 22 Target.Sheets(1).Range("H2").Copy ThisWorkbook.Sheets(2).Range("A3") 23 24 25 ThisWorkbook.Sheets(2).Range("A2:A3").Value = ThisWorkbook.Sheets(2).Range("A2:A3").Value '数式→数値変換 26 ThisWorkbook.Sheets(2).Range("A2:A3").NumberFormatLocal = "yyyymmdd" 27 28 'ここにsheet1のA7とC7から月日を抽出し、それにA2,A3の数値を足してyyyymmddにする記述。 29 'yyyymmdd変換、そして半早のスケジュール登録すれば完成。 30 31 Target.Close '※開いたブックは閉じておく 32 Set Target = Nothing '念のため、変数開放 33 34Dim sh As Worksheet 'csv保存モジュール 35Set sh = Worksheets(2) 36sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV 37 38End Sub 39 40 41Sub Sample_036()`coco_bauerさん用の情報追加。VBA5行を使いyyyymmdd"20200301"表記するコード例 42 Dim myDate As Date 43 44 myDate = DateSerial(Range(“A2″), Range(“B2″), Range(“C2″)) 45 MsgBox myDate 46End Sub 47 48

試したこと

上記合算の手法を調べ、1,2,3といった"日にち"表示から別セルの2020、03といった"年"、"月"表示をセルごとに合算させるやり方を検索しても、1つのセルに20200301と"yyyymmddで8桁表記"するために1つのセル当たりVBA5行も使うようなのコードばかりヒットして悩んでいます。
もしもっと簡易なVBAでの表現方法があれば教えてください。

補足情報(FW/ツールのバージョンなど)

Excle2016

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

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

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

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

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

coco_bauer

2020/04/21 01:58

「1,2,3,・・・31(日)と"日にち"が抽出先のシートにyyyymmdd表記でCSVで出力されるようになってます」と書かれていますが、出力先のシートのどこ(ワークシート?セル?)に出力されるのですか。 「yyyymmdd表記でCSVで出力」というのは、どのような内容が出力されるのですか? 『「1,2,3,・・・31(日)」と』書かれていますが、これと「yyyymmdd表記でCSVで」とは関係しているのですか? 「2020、03といった"年"、"月"表示をセルごとに合算」というのは、二つの文字列"2020"と"03"を連結して"202003"という文字列を作るという意味でしょうか? また、「1つのセル当たりVBA5行も使うようなのコード」というのを質問に追加してくれませんか。そうすると何をしたいのかが判ると思いますので。
r_o_234

2020/04/21 02:39

coco_bauerさん 返信ありがとうございます。 「1,2,3,・・・31(日)と"日にち"が抽出先のシートにyyyymmdd表記でCSVで出力されるようになってます」と書かれていますが、出力先のシートのどこ(ワークシート?セル?)に出力されるのですか。 >出力先のシートのセル(A2,A3)に出力されるようになっています。 「yyyymmdd表記でCSVで出力」というのは、どのような内容が出力されるのですか? 『「1,2,3,・・・31(日)」と』書かれていますが、これと「yyyymmdd表記でCSVで」とは関係しているのですか? >関係してます。 例えば、抽出元(読込)のエクセルのセルに"〇月の" 1,2,3,4,5…31という数値(数式)のセルがあります。これを、ある外部のソフトウェアに読み込ませる為に,yyyymmdd表記で20200301,20200302といった風にVBAで変換し、yyyymmdd表記かつCSVで特定のフォルダに出力しています。この出力されたCSVファイルを外部のソフトウェアにアップロードして読込むむことがこの転換マクロVBAツールの目的です。 「2020、03といった"年"、"月"表示をセルごとに合算」というのは、二つの文字列"2020"と"03"を連結して"202003"という文字列を作るという意味でしょうか? >はいその意味であっています。 その例えば"202003"の年月を、さらに"01","02"という日の文字列と連結し、yyyymmdd表記することで8桁の"20200301","20200302"と表記します。この形式が外部のソフトウェアが読込可能な形式なのです。 また、「1つのセル当たりVBA5行も使うようなのコード」というのを質問に追加してくれませんか。そうすると何をしたいのかが判ると思いますので。 >コードの最下部に追加しました。例えばこのようなコードです。 これはセルA2に「年」、セルB2に「月」、セルC2に「日」が入っているものを合算してmydataに入れるコードです。 よろしくお願いします。
guest

回答2

0

以下の引数
西暦 yyyy (2020等)
月  mm (112)
日  dd (1
31)
をもとにYYYYMMDD形式の文字列を返す関数を作成しました。

VBA

1Public Function FormatYYYYMMDD(ByVal yyyy As Variant, ByVal mm As Variant, ByVal dd As Variant) As String 2 FormatYYYYMMDD = Format(yyyy * 10000 + mm * 100 + dd, "00000000") 3End Function 4

添付図は、excelのユーザー定義関数としてexcelから呼び出していますが、マクロからの呼び出しも
当然可能です。
添付図

投稿2020/04/21 04:35

tatsu99

総合スコア5438

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

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

r_o_234

2020/04/21 07:30 編集

tatsu99さん 回答ありがとうございます。 教えて頂いたVBAを空きセルで実験したところ動作しました。 ただ、1点疑問点があり、 このPublic Function…のVBAを、私の該当のソースコードのPublic Sub内に統合しようとすると エラーを吐いてしまいます。 FunctionとSubは殆ど同じと調べたので、 "Public Function FormatYYYYMMDD(ByVal yyyy As Variant, ByVal mm As Variant, ByVal dd As Variant) As String" を "FormatYYYYMMDD(ByVal yyyy As Variant, ByVal mm As Variant, ByVal dd As Variant) As String" と書いて(Public Functionを削除して)、Public Sun内に統合しようとするとエラーを吐いてしまいます。 こちらも、方法・考え方等もしおわかりになれば教えて頂けないでしょうか。 よろしくお願いします。
tatsu99

2020/04/21 07:18 編集

エラーメッセージは具体的に何が表示されていますか。 「私のPublic Sub内」とは、それがsampleとすると Public Sub sample() ・・・① End Sub のように①の個所に Public Function FormatYYYYMMDDを書いたのでしょうか。 それだとえらーになります。 Public Function FormatYYYYMMDDはPublic Sub sampleの外に定義してください。
tatsu99

2020/04/21 07:33 編集

もし、publicにしたくないなら Private Function FormatYYYYMMDD(ここは省略) としてください。
r_o_234

2020/04/21 08:38

tatsu99さん 返信ありがとうございます。 該当のソースコードのPublic Sub内にPublic Functionを書くやり方はエラーを吐きます。 エラーメッセージは、"コンパイルエラー:代入式の左辺の関数呼び出しは、バリアント型またはオブジェクトが他の値を返さなければなりませんです。" なので今度は、subをFunctionに置き換えれば良いのか?と思い、 該当のソースコードの"Public Sub FileUpload()"を"Public Function FormatYYYYMMDD(ByVal yyyy As Variant, ByVal mm As Variant, ByVal dd As Variant) As String"に書き換えて、End Functionで閉じてみたところ、VBAを実行する画面で選択するマクロ名(M)がない状態になってしまい、実行できません。 何か原因等おわかりになれば教えて頂けませんか。
tatsu99

2020/04/21 08:55

>該当のソースコードのPublic Sub内にPublic Functionを書くやり方はエラーを吐きます。 だから、Public Subの外に出すんですよ。 記述例を次の回答に書いておきます。
r_o_234

2020/04/22 02:40

ありがとうございました!教えて頂いたコードで動作しました。 ひとまず解決とさせて頂きます。ご協力ありがとうございました。
guest

0

ベストアンサー

記述例です。
Public Function FormatYYYYMMDDの代わりに
Private Function FormatYYYYMMDDとかいても構いません。
メッセージボックスに"20200301"が表示されます。

VBA

1Public Sub samaple() 'あなたのpublic sub 2 Dim str As String 3 str = FormatYYYYMMDD(2020, 3, 1) 4 MsgBox (str) 5End Sub 6 7Public Function FormatYYYYMMDD(ByVal yyyy As Variant, ByVal mm As Variant, ByVal dd As Variant) As String 8 FormatYYYYMMDD = Format(yyyy * 10000 + mm * 100 + dd, "00000000") 9End Function 10 11

投稿2020/04/21 08:54

tatsu99

総合スコア5438

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

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

r_o_234

2020/04/22 02:40

ありがとうございました!教えて頂いたコードで動作しました。 ひとまず解決とさせて頂きます。ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問