Accessフォームで入力したレコードにボタンをクリックすると指定のExcelのセルに転送されるようにしたいです。Excelファイルは既に用意してありますが今回はTEST用にファイルを作成しました。
ボタンをクリックしたときに以下のようにVBAを設定したところ、
6行目の部分で止まってしまいました。
このVBAはネットで調べてまねたものになります。ファイル名やセルだけ変更しました。
VBAド素人で原因がぜんぜんわからなかったので教えてください。
よろしくお願います。
Private Sub Ctl7F_Click()
Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言
Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言
Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言
Dim strNewCell As String
Dim objRange As Range ※ここで止まってしまいました
Const xlCellTypeLastCell = 11
Dim FilePath As String
FilePath = Application.CurrentProject.Path & "TEST.xlsx"
Set AppObj = CreateObject("Excel.Application") '実行時バインディング
Set WBObj = AppObj.Workbooks.Open(FilePath) 'ワークブックを開く
Set WsObj = WBObj.Worksheets("Sheet1")
AppObj.Visible = True
Set AppObj = GetObject _
(, "Excel.Application")
Set WsObj = AppObj.Worksheets("Sheet1")
Set objRange = WsObj.UsedRange
objRange.SpecialCells(xlCellTypeLastCell).Activate
strNewCell = "A" & AppObj.ActiveCell.Row + 1
AppObj.Range(strNewCell).Activate
With AppObj.Range(strNewCell)
.Cells(3, 3) = Me![部課]
.Cells(4, 3) = Me![所属]
.Cells(3, 12) = Me![計測日]
.Cells(16, 13) = Me![外観正常]
End With
AppObj.DisplayAlerts = False
WBObj.Save 'ワークブックを保存する
WBObj.Close 'ワークブックを閉じる
AppObj.Quit
AppObj.DisplayAlerts = True
DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord , , acNewRec
MsgBox "ACCESS Excel データ転送が完了しました "
End Sub
No.6ベストアンサー
- 回答日時:
>ただ転送自体がPC内にあるダウンロードにしか転送できない状態になってしまいました。
>AccessのVBAで転送先を指定する必要があるのでしょうか?
FilePath = Application.CurrentProject.Path & "\" & "TEST.xlsx" '※パスの修正
↑この行でAccessの自ACCDBファイルのあるフォルダを指定していますから
多分ですが「ダウンロード」フォルダにAccessファイルを置いて試しているのではないですか?
あなたの都合の良いように変更すれば…と思います。
>外観正常フィールドはYes/No型で設定しているのですが、
>Excelへ転送すると-1と表示されてしまいます。
AccessのYes/No型は内部データは、-1/0 で保存されていて
人間が分かりやすいようにYes/No や True/False と表示しているだけです。
なのでAccessは実際の値である -1/0 をExcelに渡しています。
そちらの都合の良い表示、Yes/No や ○/● とかに変更するには
.Cells(16, 13) = Me![外観正常] を
.Cells(16, 13) = iif(Me![外観正常] = -1,"Yes","No")
などとすればよろしいかと。
回答ありがとうございます。
なるほどそういうことでしたか!
いろいろ教えていただきありがとうございました。
本当に助かりました。
No.5
- 回答日時:
こんな感じでは?
Private Sub Ctl7F_Click()
Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言
Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言
Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言
'Dim RgObj As Object '※Rangeオブジェクト用に宣言
'Dim strNewCell As String
'Dim objRange As Range ※ここで止まってしまいました
Const xlCellTypeLastCell = 11 '不要では?
Dim FilePath As String
FilePath = Application.CurrentProject.Path & "\" & "TEST.xlsx" '※パスの修正
Set AppObj = CreateObject("Excel.Application") '実行時バインディング
Set WBObj = AppObj.Workbooks.Open(FilePath) 'ワークブックを開く
Set WsObj = WBObj.Worksheets("Sheet1")
'Set RgObj = WsObj.UsedRange '使用する場合はこんな風にセット
DoCmd.RunCommand acCmdSaveRecord '※ここでレコードの保存が必要
AppObj.Visible = True
'Set AppObj = GetObject _
'(, "Excel.Application")
'Set WsObj = AppObj.Worksheets("Sheet1") ’この3行は不要
'RgObj.SpecialCells(xlCellTypeLastCell).Activate '以下の3行も不要では?
'strNewCell = "A" & AppObj.ActiveCell.Row + 1
'AppObj.Range(strNewCell).Activate
With WsObj 'AppObj.Range(strNewCell)
.Cells(3, 3) = Me![部課]
.Cells(4, 3) = Me![所属]
.Cells(3, 12) = Me![計測日]
.Cells(16, 13) = Me![外観正常]
End With
AppObj.DisplayAlerts = False
WBObj.Save 'ワークブックを保存する
WBObj.Close 'ワークブックを閉じる
AppObj.Quit
AppObj.DisplayAlerts = True
Set WsObj = Nothing: Set WBObj = Nothing: Set AppObj = Nothing
DoCmd.GoToRecord , , acNewRec
MsgBox "ACCESS Excel データ転送が完了しました "
End Sub
なお、VB6でのお話ですがVBAでも参考になると思わます。
オートメーションにおける事前バインディングおよび実行時バインディングの使用
http://support.microsoft.com/kb/245115/ja
Excel のタスクを正常に終了できない現象
http://hanatyan.sakura.ne.jp/vbhlp/ExcelErr.htm
回答ありがとうございました。
無事データの転送ができるようになりました!!!
ただ転送自体がPC内にあるダウンロードにしか転送できない状態になってしまいました。AccessのVBAで転送先を指定する必要があるのでしょうか?
また、外観正常フィールドはYes/No型で設定しているのですが、Excelへ転送すると-1と表示されてしまいます。これもVBA上で設定を変えないといけないのでしょうか?
いろいろ質問してしまい申し訳ございませんが教えていただけると幸いです。よろしくお願いいたします。
No.4
- 回答日時:
こんばんは
ACCESSからなので示されているコードの場合、すでにされている通り
Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言 の様に
同じ行で
Dim objRange As Object 'Excel.Rangeオブジェクトの宣言
とすれば、解消されると思います。
当方ACCESSが無いので分かりませんが、事前バインディングRange型で
.SpecialCellsは追加されるのかな?
.SpecialCellsについてもAs Objectでコンパイルできると思います
頓珍漢な事を言ってたらごめんなさい。
あと、ご質問とは関係ないところですが、
1点になるのは、同じ個所の
objRange.SpecialCells(xlCellTypeLastCell).Activate
これはセル範囲をアクティブにするコードですが、Excelの場合、
オブジェクト上位にあるシートがアクティブである事が必要です。
言い換えると、開いた(取得した)ブックに2シートありSheet2が表示されている状態で保存されている場合、
Set WsObj = WBObj.Worksheets("Sheet1")
Set objRange = WsObj.UsedRange
objRange.SpecialCells(xlCellTypeLastCell).Activate
なのでSheet1が取得できないよ?エラーが返ります
勿論、開くブックは必ずSheet1しかないのなら良いのですが、、
WsObj.Activate などを入れておく方が安心?かと思いました。
エラー対策などはこれからと言う事でしょうが、気になりましたので一応
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
AccessのデータをExcelの決まったフォーマットに出力するには?
その他(データベース)
-
Msgboxにテーブルのレコードを表示させたい。
Access(アクセス)
-
Access VBAでクエリーのレコード件数を取得したいのですが
その他(データベース)
-
-
4
アクセスクエリ(複数)→マクロ→エクセル出力(ワークシート別)
その他(パソコン・スマホ・電化製品)
-
5
AccessからExcelへエクスポートするときにファイル名を指定したい。
Excel(エクセル)
-
6
Access 別フォームへの再クエリ(更新)がしたい。
その他(データベース)
-
7
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
8
ACCESSからexcelブックを開いて保存したい
Excel(エクセル)
-
9
accessでクエリをExcelにエクスポートする時にファイル名に日付を追加したい
Access(アクセス)
-
10
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
11
accessデータを指定したExcel、そして指定したセルへエクスポートするaccess VBAコー
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルVBAでcode128のバー...
-
VBAで既に開いている別アプリケ...
-
「オブジェクト変数または With...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルのVBAの標準モジュール...
-
VBAからPDFファイルにパスワー...
-
[C#]static void 関数内でthis
-
PowerPointVBAでスライドマスタ...
-
オブジェクトが見つかりません
-
ExcelVBAで参照設定を自動に行う
-
VBA:オートシェイプの線の長...
-
WordにOLEで埋め込んだExcelでW...
-
VBからPDFファイル自動生成...
-
エクセルマクロエラー「'Cells'...
-
オブジェクト名が同じ図形の変更
-
テキストボックス中の文字列の...
-
ExcelのVBAについて(グラフ操作)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
VBAで既に開いている別アプリケ...
-
エクセルマクロエラー「'Cells'...
-
テキストボックス中の文字列の...
-
VBAで Set wb = Sheets(1).Cop...
-
ある文字列が全て数字であるか...
-
VBAからPDFファイルにパスワー...
-
VBScriptでファイルの日時順(降...
-
EXCEL VBA オートシェイプナン...
-
[VBA]CDOメッセージ送信エラー
-
エクセルVBAで2つの画像を比較...
-
PowerPointVBAでスライドマスタ...
-
UserForm1.Showでエラーになり...
-
上下の位置揃えについて
-
VBAについてです。 初心者です...
-
VBAで作成するメール(開封確認...
おすすめ情報