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

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

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

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

798閲覧

AccessからExcelデータの加工・出力時間が長い

ukana

総合スコア7

VBA

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/09/05 01:12

編集2022/09/05 01:17

前提

お世話になっております。

Microsoft access 365で
データベース構築をしています。

AccessVBAからExcelデータをエクスポートするのですが
出力したExcelを開くと関数として表示したかったセルが
テキストとして出力され自動計算されません。
(出力されたExcelデータの該当セルをTYPE関数で見ると
論理値(4)ではなくテキスト(2)でした)

そこで別の質問にてお聞きしたところ
(https://teratail.com/questions/ubyo6wcepiu0ea)
CreateObject("Excel.Application")から
Excelオブジェクトでの編集を提案して頂き
そちらを実施しました。
確かにテキストだったものが関数として出力されましたが
データ出力までに1分ほどかかります。
(前回質問の回答の意図がくみ取れておらず
適切なプログラムでないかもしれません。)
そこで別の方法がないかお聞きしたいです。

実現したいこと

AccessからExcelデータを出力するのに
関数を記載したテキストが論理値として出力される
もしくはテキストとして出力後
論理値として変換される。
これを出力時間30秒程度で実現したいです。

該当のソースコード

前回質問時(変更前)のテキストとして出力される
関数部分(処理1~3)のプログラムでの記載内容が以下です。

vba

1Do Until rsa.EOF 2 j = j + 1 3 If rsa!間口 <> Null Or rsa!間口 <> "" Then 4 i = i + 1 5 rsa!照合1 = "1" 6 rsa!照合2 = "2" 7 rsa!処理1 = "=IF(E" & j & "=L" & j & ",TRUE,FALSE)" 8 rsa!処理2 = "=IF(MID(M" & j & ",11,15)=E" & j & ",TRUE,FALSE)" 9 rsa!処理3 = "=IF(MID(M" & j & ",27,1)=F" & j & ",TRUE,FALSE)" 10       rsa.Update 11 End If 12 rsa.MoveNext 13 Loop

上記のレコードセット記載の内容を追加したテーブルを
Excelテンプレートに出力します。
上記のコードが記載し下記のプログラムで出力されたExcelデータを開き、
該当セルを選択→enterで確定してみるとテキストから関数として認識されます。

vba

1 Const csOutputTemplate As String = "出力テンプレート.xltx" 2 strFileName = pass & "\" & name & Format(day, "yyyymmddhhmm") & ".xlsx" 3 Set xlapp = CreateObject("Excel.Application") 4 5 Set myCn = CurrentProject.Connection 6 strsql = "SELECT * FROM checksheet WHERE ((間口)>0) ORDER BY ID" 7 myRs.Open strsql, myCn, adOpenForwardOnly, adLockReadOnly 8 9 With xlapp 10 strTemplate = Application.CurrentProject.Path & "\" & csOutputTemplate 11 .Workbooks.Open strTemplate 12 .Cells(5, 1).CopyFromRecordset myRs '結果値出力処理(ヘッダー位置調整) 13 .ActiveWorkbook.SaveAs FileName:=strFileName 14 End With

論理値として出力されますが出力に1分ほどかかるプログラムが以下です。
こちらでは上記のレコードセットの書き込みはせず
Excelテンプレートで出力後にobjWs.Cells(, ).Valueを
利用してAccessからExcelへ書き込んでいます。
この処理に変えた途端出力時間が長くなったように思うので
別の方法があれば教えて頂きたいです。

vba

1 Dim objExcel As Object, objWb As Object, objWs As Object 2 3 Set objExcel = CreateObject("Excel.Application") 4 Set objWb = objExcel.Workbooks.Open(pass) 5 Set objWs = objWb.Worksheets("Sheet1") 6 7 Dim wb As Workbook 8 Set wb = ActiveWorkbook 9 10 Dim j As Integer 11 12 objWs.Cells(2, 18).Value = Now() 13 14 For j = 5 To max 15 If objWs.Cells(j, 9).Value <> "" And objWs.Cells(j, 6).Value <> "対象外" Then 16 objWs.Cells(j, 13).Value = "1" 17 objWs.Cells(j, 14).Value = "2" 18 objWs.Cells(j, 15).Value = "=IF(E" & j & "=L" & j & ",TRUE,FALSE)" 19 objWs.Cells(j, 16).Value = "=IF(MID(M" & j & ",11,15)=E" & j & ",TRUE,FALSE)" 20 objWs.Cells(j, 17).Value = "=IF(MID(M" & j & ",27,1)=F" & j & ",TRUE,FALSE)" 21 End If 22 Next j 23 24 objWb.Save 25 Set objWs = Nothing 26 Set objWb = Nothing 27 28 objExcel.Quit 29 Set objExcel = Nothing 30

よろしくお願いいたします。

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

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

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

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

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

ukana

2022/09/05 02:12

出力時間30秒程度と具体的な理想を 書いてしまいましたが プログラムの全体像を書いておらず 環境にも依存するので 現状の出力速度より早くなるような 方法ありましたら教えて頂きたいです。
guest

回答1

0

ベストアンサー

エクセルの Range.Value プロパティに再代入すれば、”=”で始まるテキストは数式として認識されます。

vba

1 With xlapp 2 strTemplate = Application.CurrentProject.Path & "\" & csOutputTemplate 3 .Workbooks.Open strTemplate 4 .Cells(5, 1).CopyFromRecordset myRs '結果値出力処理(ヘッダー位置調整) 5 Dim rngTbl As Range 6 Set rngTbl = .Cells(5, 1).CurrentRegion 'テーブル範囲 7 '↓数式の列のテキストを数式に変換、列は実際の数式の列に変更してください。 8 rngTbl.Column(3).Value = rngTbl.Column(3).Value 9 rngTbl.Column(4).Value = rngTbl.Column(4).Value 10 rngTbl.Column(5).Value = rngTbl.Column(5).Value 11 .ActiveWorkbook.SaveAs FileName:=strFileName 12 End With

投稿2022/09/05 02:46

hatena19

総合スコア33692

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

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

ukana

2022/09/06 14:37 編集

返信が遅くなり申し訳ありません。回答ありがとうございます。 教えて頂いた通りプログラムを記載したつもりなのですが rngTbl.Column(15).Value = rngTbl.Column(15).Value 上記の.Columnの部分で引数の数が一致していませんという コンパイルエラーが出てしまいました。そこで rngTbl.Range("O5:O1000").Value = rngTbl.Range("O5:O1000").Value rngTbl.Range("P5:P1000").Value = rngTbl.Range("P5:P1000").Value rngTbl.Range("Q5:Q1000").Value = rngTbl.Range("Q5:Q1000").Value とするとエラーは消えて出力されたのですが O5:Q7の範囲のみテキストになっています。 範囲の指定が間違っているのか原因がわかりません。 教えて頂けると嬉しいです。
hatena19

2022/09/06 14:18

すみません。Column を Columns に変更してください。 それでだめなら、下記も試してみてください。 rngTbl.Columns(15).Formula = rngTbl.Columns(15).Value
ukana

2022/09/06 14:39

すみません、こちらのプログラムが一部ちがっていたので修正したのですが 編集のタイミングが重なってしまいました。 rngTbl.Columns(15).Formula = rngTbl.Columns(15).Value こちら試してみます。
ukana

2022/09/06 14:47

rngTbl.Columns(15).Formula = rngTbl.Columns(15).Value rngTbl.Columns(16).Formula = rngTbl.Columns(16).Value rngTbl.Columns(17).Formula = rngTbl.Columns(17).Value 上記に書き換えたところ、Excelに数式として出力されました! 処理も以前は1分以上かかっていたものが10数秒で処理が完了しました。 再代入という発想は全くなく、一人では解決していなかったと思います。 大変たすかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問