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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

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

Q&A

解決済

4回答

2208閲覧

VBA シート1のA7、C7、シート2のA2の"2020"03"01"の数値を合算させyyyymmddの"20200301"と数値でセルに表示する手法

r_o_234

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

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

0グッド

0クリップ

投稿2020/04/28 07:28

前提・実現したいこと

VBAで転換マクロツールを創っています。
いま、画像に示すようにVBAでシート1のA7、C7、シート2のA2の3つのセルの数値を合算させて、
シート2のA2のセルに"20200301"と表示するVBAを組んでいます。
以前教わったyyyymmddの8桁表示のVBAを改変してセルを代入してもエラーを吐いて正常に動作しません。
原因・改善法などおわかりなれば教えてください。

[![イメージ説明]
[![イメージ説明]
[![イメージ説明]

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

実行時エラー'438' オブジェクトは、このプロパティまたはメソッドをサポートしていません。

該当のソースコード

VBA

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

試したこと

VBAで&の記述を使えば良いのか、変数の方が違うのかと色々試行錯誤しているのですが詰まっています。
もしおわかりになればお教え頂けると助かります。
よろしくお願いします。

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

Excle2016,Windows10

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

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

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

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

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

tatsu99

2020/04/28 09:23

str = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2)の ①Sheet1!A7は、マクロの格納されているブック内のSheet1ですか。 ②Sheet1!C7は、マクロの格納されているブック内のSheet1ですか。 ③A2のシート名は、なんですか。ブックはマクロの格納されているブックですか。
r_o_234

2020/05/03 07:42

tatsu99さん ご協力ありがとうございます。 こちらの都合で申し訳ないのですが、GWに入った為一旦作業を中断しております。休暇開けましたらまたご返信致します。 何卒よろしくお願いします。
r_o_234

2020/05/07 02:47 編集

tatsu99さん ご協力ありがとうございます。 休暇を挟み、遅くなってしまいすみませんがご返信致します。 これらのマクロは標準モジュールの中に書いているので、ブック内にマクロを格納していることはありません。 str = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2)の ①Sheet1!A7は、マクロの格納されているブック内のSheet1ですか。 →Sheet1!A7のシート名はSheet1で、マクロは標準モジュール内に書かれています。 ②Sheet1!C7は、マクロの格納されているブック内のSheet1ですか。 →Sheet1!C7のシート名はSheet1で、マクロは標準モジュール内に書かれています。 ③A2のシート名は、なんですか。ブックはマクロの格納されているブックですか。 →A2のシート名はSheet2で、マクロは標準モジュール内に書かれています。 よろしくお願いします。
guest

回答4

0

以下のようにしてください。

VBA

1str = FormatYYYYMMDD(Worksheets("Sheet1").Range("A7").Value, Worksheets("Sheet1").Range("C7").Value, Worksheets("Sheet2").Range("A2").Value)

投稿2020/05/07 02:31

tatsu99

総合スコア5438

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

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

r_o_234

2020/05/07 03:09

tatsu99さん ご協力ありがとうございます。 "str = FormatYYYYMMDD(Worksheets("Sheet1").Range("A7").Value, Worksheets("Sheet1").Range("C7").Value, Worksheets("Sheet2").Range("A2").Value) "を挿入した所、 38行目(sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV)で以下のエラーが発生します。 "実行時エラー'1004':'SaveAs'メソッドは失敗しました:'_Worksheet'オブジェクト" こちらも試行錯誤してみますので、もしおわかりになれば教えて頂けると助かります。
guest

0

VBAなど書かなく、DATE関数でシリアル値を出して、表示形式で制御するか、TEXT関数で表示を変えればいいんじゃない?

Excel関数

1=DATE(A1,B1,C1) 2 で、セルの表示形式を YYYYMMDD にする 3  4 5=TEXT(DATE(A1,B1,C1),"YYYYMMDD")

投稿2020/04/28 12:22

kai_keitai

総合スコア344

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

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

r_o_234

2020/05/03 07:44

kai_keitaiさん ご協力ありがとうございます。 こちらの都合で申し訳ないのですが、GWに入った為一旦作業を中断しております。休暇開けましたらまたご返信致します。 何卒よろしくお願いします。
r_o_234

2020/05/07 03:10 編集

kai_keitaiさん 回答ありがとうございます。返信遅れましてすみません。 DATA関数とTEXT関数を動かしてみて参考になりました、ありがとうございます。 このマクロは転換ツールなため、 該当のエクセルファイルから数値を抜き出してきて変換をかけて、 "20200301"とか"20200302"の8桁のyyyymmdd表記にして外部ソフトウェアに読み込ませる形にすることを想定してます。 なので、エクセルのセルのマス目自体に書いたコードは、転換・変換の動作をした際に消去されてしまうのです。従って、エクセルのマス目は空欄にしておいて、VBAからの操作で転換・変換を完了させる開発意図があります。説明が不足ですみません。ご協力ありがとうございございます!
guest

0

エクセル表記になっているせいで発生しているのでは?

下記のように、
VBA表記にして試してみてください。

str = FormatYYYYMMDD(sheets(Sheet1).range("A7"), sheets(Sheet1).range("C7"), range("A2"))

投稿2020/04/28 09:15

Nah_Y

総合スコア5

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

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

r_o_234

2020/05/03 07:44

Nah_Yさん ご協力ありがとうございます。 こちらの都合で申し訳ないのですが、GWに入った為一旦作業を中断しております。 休暇開けましたらまたご返信致します。 何卒よろしくお願いします。
r_o_234

2020/05/07 03:10

Nah_Y さん ご協力ありがとうございます。返信遅れましてすみません。 VBA表記で入力してみたところ以下の2通りのエラーが発生します。 ①38行目(sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV)で、"実行時エラー'1004''SaveAS'メソッドは失敗しました:'_Worksheet'オブジェクト"と表記されます。 ②41行目(str = FormatYYYYMMDD(Sheets(Sheet1).Range("A7"), Sheets(Sheet1).Range("C7"), Range("A2"))で"実行時エラー'13'型が一致しません"と表記されます。 こちらも試行錯誤してみますので、もしおわかりになれば教えて頂けませんか。
Nah_Y

2020/05/10 01:26

①SaveAsのオブジェクトがWorksheetsになっているので、Workbookに変更して下さい。 参考) Dim sh As Workbook 'csv保存モジュール Set sh = Activeworkbook sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV ②申し訳ありません。一部表記ミスがありました。 str = FormatYYYYMMDD(Sheets(Sheet1).Range("A7"), Sheets(Sheet1).Range("C7"), Range("A2")) ↓に変更して下さい。 str = FormatYYYYMMDD(Sheets("Sheet1").Range("A7"), Sheets("Sheet1").Range("C7"), Range("A2"))
r_o_234

2020/06/02 01:35

Nah_Yさん ご協力ありがとうございます。ご返信忘れていまして申し訳ありませんでした。 一応自己解決致しました。誠にありがとうございました。
guest

0

自己解決

一応解決しました。
VBAをスリム化して書き直し再現性をチェックして試行錯誤した所、
csv上書き処理をキャンセルする際に1004エラーが出るということを突き止めました。
上書きすればエラーは出ず、またcsvファイルを削除して保存する際もエラーが出ません。

根本的な原因、上書き処理をキャンセルする際に何故エラーが出るのか、エラーが出なくなる為の対処法はまだ未解決ですが、全体の開発を進めてから後程この仕様を解決することにしました。
ご協力ありがとうございます。

投稿2020/05/13 05:00

r_o_234

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問