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

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

ただいまの
回答率

88.04%

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

解決済

回答 4

投稿

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

score 15

前提・実現したいこと

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

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

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

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

該当のソースコード

Public Sub FileUpload() 'ファイル選択ダイアログモジュール

    Dim fType As Variant
    Dim fPath As Variant
    Dim str As String 'yyyymmdd出力用

'※選択できるファイルの種類はエクセルファイルのみ
    fType = "Microsoft Excelブック,*.xls?" '※

'ファイル参照ダイアログの表示
    fPath = Application.GetOpenFilename(fType, , "") 'fType = fPath。
    Debug.Print fPath
    If fPath = False Then
'ダイアログでキャンセルボタンが押された場合は処理を終了します
       Exit Sub 'Endで強制終了はよろしくない
    End If

    Dim Target As Workbook 'コンバートモジュール
    Set Target = Workbooks.Open(fPath)

    'これをセル抜き出しから数値抜出に変更⇔循環小数エラーの解決。
    Target.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("A2")
    Target.Sheets(1).Range("H2").Copy ThisWorkbook.Sheets(2).Range("A3")

    'ThisWorkbook.Sheets(2).Range("A2") = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2)
    'ThisWorkbook.Sheets(2).Range("A3") = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A3)

    ThisWorkbook.Sheets(2).Range("A2:A3").Value = ThisWorkbook.Sheets(2).Range("A2:A3").Value '数式→数値変換
    ThisWorkbook.Sheets(2).Range("A2:A3").NumberFormatLocal = "yyyymmdd"

    'yyyymmdd変換、そして半早のスケジュール登録すれば完成。

     Target.Close '※開いたブックは閉じておく
     Set Target = Nothing '念のため、変数開放

Dim sh As Worksheet 'csv保存モジュール
Set sh = Worksheets(2)
sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV

str = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2) 'str = FormatYYYYMMDD(2020, 3, 1)をstr = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2)に改変してエラーを吐く。
MsgBox (str) 'yyyymmdd出力用

End Sub

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

試したこと

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

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

Excle2016,Windows10

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • tatsu99

    2020/04/28 18:23

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

    キャンセル

  • r_o_234

    2020/05/03 16:42

    tatsu99さん

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

    キャンセル

  • r_o_234

    2020/05/07 11:16 編集

    tatsu99さん

    ご協力ありがとうございます。
    休暇を挟み、遅くなってしまいすみませんがご返信致します。
    これらのマクロは標準モジュールの中に書いているので、ブック内にマクロを格納していることはありません。

    str = FormatYYYYMMDD(Sheet1!A7, Sheet1!C7, A2)の
    ①Sheet1!A7は、マクロの格納されているブック内のSheet1ですか。
    →Sheet1!A7のシート名はSheet1で、マクロは標準モジュール内に書かれています。

    ②Sheet1!C7は、マクロの格納されているブック内のSheet1ですか。
    →Sheet1!C7のシート名はSheet1で、マクロは標準モジュール内に書かれています。

    ③A2のシート名は、なんですか。ブックはマクロの格納されているブックですか。
    →A2のシート名はSheet2で、マクロは標準モジュール内に書かれています。

    よろしくお願いします。

    キャンセル

回答 4

+1

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/05/03 16:44

    Nah_Yさん

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

    キャンセル

  • 2020/05/07 12: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'型が一致しません"と表記されます。

    こちらも試行錯誤してみますので、もしおわかりになれば教えて頂けませんか。

    キャンセル

  • 2020/05/10 10: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"))

    キャンセル

  • 2020/06/02 10:35

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

    キャンセル

+1

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

=DATE(A1,B1,C1)
 で、セルの表示形式を YYYYMMDD にする
 

=TEXT(DATE(A1,B1,C1),"YYYYMMDD")

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/05/03 16:44

    kai_keitaiさん

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

    キャンセル

  • 2020/05/07 11:48 編集

    kai_keitaiさん
    回答ありがとうございます。返信遅れましてすみません。
    DATA関数とTEXT関数を動かしてみて参考になりました、ありがとうございます。

    このマクロは転換ツールなため、
    該当のエクセルファイルから数値を抜き出してきて変換をかけて、
    "20200301"とか"20200302"の8桁のyyyymmdd表記にして外部ソフトウェアに読み込ませる形にすることを想定してます。

    なので、エクセルのセルのマス目自体に書いたコードは、転換・変換の動作をした際に消去されてしまうのです。従って、エクセルのマス目は空欄にしておいて、VBAからの操作で転換・変換を完了させる開発意図があります。説明が不足ですみません。ご協力ありがとうございございます!

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/05/07 12: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'オブジェクト"

    こちらも試行錯誤してみますので、もしおわかりになれば教えて頂けると助かります。

    キャンセル

check解決した方法

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

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