前提
お世話になっております。
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
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー