みなさま、こんにちは。
ACCESSのFORMにボタンを作って、イベントのビルドでCSVファイルを読み込んで、編集して指定したEXCELシートに貼り付けようとVBAを組んでいるのですが、困ってしまいました。

データを一気に読み込んだあと、2次元の配列にして
aRecord(r, a)にレコードと項目ごとに値をセットしています。
データを編集後、
ES(b).Cells(posR, posC) = aRecord(r, a)
でエクセルのセルに値を入れているのですが、この方法だとEXCELを更新することが
できなくて困っています。

ACCESS/EXCEL連携で、ACCESSからEXCELシートを更新できるコマンドがあると聞いたことがあるのですが、具体的にどのようなコマンドを
どのように使えばよいのか、ご存知ないでしょうか?

もしおわかりになる方がいらっしゃいましたら、是非ご教授下さいますよう
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

これは私が実際に、AccessからExcelを起動して書き込みに成功しているものです。


いろいろと問題があるプロシージャかもしれませんが、とりあえず出来ました。(汗笑)
Excel起動の際、既に起動済であっても新しくインスタンスを生成してしまっています。(2重起動)
行頭のタブが無理やり消されて見難いですが、参考になればよいのですが・・・

'*
'*Form_売上入力票
'*
Private Sub コマンド19_Click()

Dim cnn As New ADODB.Connection
Dim rstCustomer As New ADODB.Recordset
Dim rstDetails As New ADODB.Recordset
Dim strDetailsSQL As String
Dim strCustomerSQL As String
Dim strAbsPath As String
Dim intRsCount As Integer
Dim intPageCount As Integer
Dim i As Integer
Dim j As Integer

If OpenExcel() Is Nothing Then
MsgBox "OpenExcel failed."
Exit Sub
Else
gxLApp.Visible = True
End If

strAbsPath = Trim(Me.Application.CurrentProject.Path) & "\denpyo.xls"
If OpenExcelFile(strAbsPath) Then
'
Else
MsgBox "OpenExcelFile failed."
Call CloseExcel
Set cnn = Nothing
Set rstCustomer = Nothing
Set rstDetails = Nothing
Exit Sub
End If

strCustomerSQL = "SELECT ...(中略);"

strDetailsSQL = "SELECT ...(中略);"

Set cnn = CurrentProject.Connection
rstCustomer.CursorLocation = adUseClient
rstCustomer.Open strCustomerSQL, cnn, adOpenStatic, adLockReadOnly, adCmdText
rstDetails.CursorLocation = adUseClient
rstDetails.Open strDetailsSQL, cnn, adOpenStatic, adLockReadOnly, adCmdText

intRsCount = CInt(rstDetails.RecordCount)
intPageCount = Int(intRsCount / 5) + 1
Debug.Print "intRsCount = " & intRsCount
Call CopyPages(intPage:=intPageCount)

rstDetails.MoveFirst

For i = 1 To intPageCount

Call InsertCustomer(intPage:=i, intTotalPage:=intPageCount, rsData:=rstCustomer)

For j = 1 To 5

If rstDetails.EOF Then Exit For
Call InsertDetails(intPage:=i, intRow:=j, rsData:=rstDetails)
rstDetails.MoveNext

Next
Next

MsgBox "O.K.?"

Call CloseExcel
Set cnn = Nothing
Set rstDetails = Nothing
Set rstCustomer = Nothing

End Sub


'*
'*BasExcelAutomation
'*
Public gxLApp As Object
Public gfExcelWasRunning As Boolean

Public Function OpenExcel() As Object
'
' Excelを起動する(インスタンスを生成)
'
Set gxLApp = CreateObject("Excel.Application")
If gxLApp Is Nothing Then
MsgBox "MS Excel 9.0 is not installed on your computer"
Set OpenExcel = Nothing
Exit Function
End If
Set OpenExcel = gxLApp
End Function

Public Function CloseExcel()
'
' Excelを終了させる
'
' On Error Resume Next
If Not gxLApp Is Nothing Then
With gxLApp
.ActiveWorkbook.Close False
.Quit
End With
Set gxLApp = Nothing
End If

End Function

Public Function OpenExcelFile(strFileName As String) As Boolean

On Error Resume Next
gxLApp.Workbooks.Open Filename:=strFileName
OpenExcelFile = (Err.Number = 0)
If Not OpenExcelFile Then
MsgBox strFileName & "を開けませんでした。" & _
vbCrLf & "Err = " & Err.Number & _
vbCrLf & "FileName = " & strFileName
End If

End Function
    • good
    • 0

“EXCELは値が書き込まれないまま、処理が終了する”とのことですが、普通は“値が入った状態でEXCELを画面に表示して処理が終了”されるはずなのですが・・・


その点が問題なのではないでしょうか? 代入しようとしているデータが特殊なものやNullになってはいないでしょうか?
    • good
    • 0
この回答へのお礼

marsahさん、ご回答をありがとうございます。
EXCELのマクロで動かした場合はちゃんといくのですが、ACCESSから起動すると
EXCELのワークシートが一瞬だけ画面に現れて、すぐに消えてACEESSの画面に
戻ってしまうんですよ・・・
うーむ。一体どうすればよいのやら・・・。

お礼日時:2001/06/11 14:50

はじめまして。

質問中の「更新」と言う意味がいまいち良くわかりませんでした。
「更新」とは、
(1)画面の更新をさせたい?
(2)セルにいれたあとのExcelシートを保存したい。
(3)その他の意味。
この点について、もうすこし、噛み砕いて説明頂ければ、回答できると思い、
投稿させて頂きました。

この回答への補足

dayan_dayanさん、レスをいただいてありがとうございます。
わかりにくい質問ですみませんでした。
ACCESSでEXCELのシートに値を書き込みたいのですが、
現在書いているコード
cells(a,b)=ほにょほにょ
の書き方ではEXCELは値が書き込まれないまま、処理が終了してしまいます。
せめて値が入った状態でEXCELを画面に表示して処理が終了すば、その後
EXCEL側でシートを保存すればよいのですが。。。

補足日時:2001/06/08 10:20
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテキスト形式(.txt)をエクセルで読み込むときに1桁目の「0」を読み込みたい

タブ区切りで作成されたテキストデータがあります。

これをエクセルで読み込むと、タブ区切りからセル区切りに自動的に変換されますが、
テキストに「0」から始まるデータがある場合、エクセルに変換されると数値として読み取ってしまうので、2桁目以降の0以外の数字を1桁目として認識してしまいます。

つまり、
「テキストデータを「文字列」のデータとしてエクセルで読み取る」
方法を探しています。

ご存知の方、教えてください。
よろしくお願いいたします。

Aベストアンサー

テキスト ファイル ウィザードの3/3のところで、
[列のデータ形式]を[文字列]にしてみてください。

QAccessフォームへの写真読み込みのエラー

Accessのテーブルに、社員番号などから、自動的に写真のフルパスを入れて、フォームに表示させるようにしています。

問題なく、写真を表示することができるのですが、中には写真のないレコードもありまして、そこで写真が読み込めないのでエラーが出てしまいます。

解決策として今考えられるのは、
1.写真のない社員については、ダミーのファイルをあらかじめ作っておく(→ダミーを作るのが面倒)
2.テーブルのフルパスを消しておく(→せっかく自動でフルパスを入れているのに、写真の有無を確認しながら、一つずつ消すのは大変)

以上から、指定フォルダにフルパスに該当する写真がない場合は、エラーでなく、読み込まないという設定はできないでしょうか?

あるいは抜本的に変えて、フォーム上のイメージをクリックするなどして、表示させる写真を選択できるようにすることができないでしょうか?

Accessにあまり詳しくないのですが、簡単なVBAなら理解できます。よろしくお願いいたします。

Aベストアンサー

自動的に写真のフルパスを入れての部分で、存在を確認し処理を分ければ良いのでは?

Dim fName As String
 fName = "フルパス"
 If Dir(fName, vbNormal) <> "" Then
   MsgBox "ある"
 Else
   MsgBox "ない"
 End If

QACCESS2000でテーブルをVBAからテーブルを読み込む方法

ACCESS2000を使っています。
以下の指定をした場合、「ユーザ定義型は定義されていません」のメッセージが出て、コンパイルが通りません。
なにかインストールや設定が必要なのでしょうか?

Dim db As Database
Dim rs As Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("テーブル名", dbopendynaset)

ヘルプ等を自分なりに参照してみたのですが、わかりません。教えてください。

Aベストアンサー

DAOの参照設定が、されていますでしょうか?

モジュールウィンドウを開いて、ツール→参照設定で、
Microsoft DAO 3.* Object Library がチェックされていないようでしたら、チェックしてみください。

今、Access2000が手元にないので自信がありませんが、Recordsetは ADO でも使えるようですが、Database はDAO のオブジェクトかと思います。

QAccess VBAで読み込んだ配列をcsvファイルにエクスポート 

VBA初心者です。
Access VBAで読み込んだ配列をcsvファイルにエクスポートしているのですが、
配列が1列ずつではなく1行ずつエクスポートされてしまいます。
どこが悪いかは大体予想がつくのですが、どうすればいいか分かりません。

また、複数のファイルを読み込んで1つのファイルにエクスポートするため、
いちいち「55:ファイルは既に開かれています」と表示されます。
これもどうにかならないでしょうか?
よろしくお願いします。

Private Sub cmd_Click()
On Error GoTo Err_cmd_Click
Dim strArg() As String
Dim Contents As String
Dim ReadFileName As String
Dim WriteFileName As String
Dim i As Integer
Dim inp As Long
Dim cnt As Integer
Dim temp As String '1行のデータの仮置き

inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動


For cnt = 0 To 30
ReadFileName = "P:\dl_engine\logs1\service\" & inp + cnt
' ファイル読込
Open ReadFileName For Input As #1
Do Until EOF(1)
Line Input #1, temp
Contents = Contents & temp & vbCrLf
Loop
Close #1
strArg = Split(Contents, " ") ' スペースで分割

WriteFileName = "C:\Contents\ザ★スクリーン\auDownLoadLog.csv"
' ファイル保存
Open WriteFileName For Output As #2
For i = 0 To UBound(strArg)
Print #2, strArg(i)
Next i
Next cnt

'正常終了
Exit_cmd_Click:
Exit Sub

'エラー処理
Err_cmd_Click:
Beep
Select Case Err.Number
Case Else
MsgBox Err.Number & ":" & Err.Description
End Select
Resume Next
End Sub

VBA初心者です。
Access VBAで読み込んだ配列をcsvファイルにエクスポートしているのですが、
配列が1列ずつではなく1行ずつエクスポートされてしまいます。
どこが悪いかは大体予想がつくのですが、どうすればいいか分かりません。

また、複数のファイルを読み込んで1つのファイルにエクスポートするため、
いちいち「55:ファイルは既に開かれています」と表示されます。
これもどうにかならないでしょうか?
よろしくお願いします。

Private Sub cmd_Click()
On Error GoTo Err_cmd_Click
Dim str...続きを読む

Aベストアンサー

内容を見ると、Access2000以上と思いますが、動かす環境が無いため、机上デバッグです。
LineInputしたtempをSplitしているので、tempがデータの行単位でこれをカンマ表示すると解釈しました。
うまくいけば、Excelに読み込める。これが目的?

Access2000なら、Splitしたら『,』を使ってJoinできなかった?(Excel2000か?)


手を加えてみました。動くかな???(止まったらごめんなさい)

Private Sub cmd_Click()
  On Error GoTo Err_cmd_Click

  Dim strArg() As String
  Dim Contents As String
  Dim ReadFileName As String
  Dim WriteFileName As String
  Dim i As Integer
  Dim inp As Long
  Dim cnt As Integer
  Dim temp As String '1行のデータの仮置き

  inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動

  '============ 保存ファイルは1つのように見える。最初に宣言 =========
  WriteFileName = "C:\Contents\ザ★スクリーン\auDownLoadLog.csv"
  '保存ファイルを開く
  Open WriteFileName For Output As #2
  '===================================================================

  For cnt = 0 To 30
    ReadFileName = "P:\dl_engine\logs1\service\" & inp + cnt

    ' ファイル読込
    Open ReadFileName For Input As #1

    Do Until EOF(1)
      Line Input #1, temp

      strArg = Split(temp, " ") ' スペースで分割
      '====== CSVファイルなのでカンマで分けた文字列にする =================
      'CSVなのにカンマがない。カンマを付加する箇所を付けてみた。
      'Access2000? ならJoin関数がある?当方、Access97のためよく分からず
      'tempにスペースがない場合があるのか
      temp = strArg(0)
      For i = 1 To UBound(strArg)
        temp = temp & "," & strArg(i)
      Next i
      '====================================================================
      Contents = Contents & temp & vbCrLf
    Loop
    Close #1

    '========= 1ファイル分のデータを書く ================
    '========= ContentsにvbCrLfがあるので改行しない=======
    Print #2, Contents;
    '========= Contentsをクリア ==========================
    Contents = ""
    '=====================================================
  Next cnt

  '======= ファイルを閉じる ===
  Close
  '============================

'正常終了
Exit_cmd_Click:
  Exit Sub

'エラー処理
Err_cmd_Click:
  Beep
  Select Case Err.Number
    Case Else
      MsgBox Err.Number & ":" & Err.Description
  End Select
  Resume Next
End Sub

内容を見ると、Access2000以上と思いますが、動かす環境が無いため、机上デバッグです。
LineInputしたtempをSplitしているので、tempがデータの行単位でこれをカンマ表示すると解釈しました。
うまくいけば、Excelに読み込める。これが目的?

Access2000なら、Splitしたら『,』を使ってJoinできなかった?(Excel2000か?)


手を加えてみました。動くかな???(止まったらごめんなさい)

Private Sub cmd_Click()
  On Error GoTo Err_cmd_Click

  Dim strArg() As String
  Dim Co...続きを読む

QAccessからExcelのコマンドボタンイベント

Access2003 WinXP です。宜しくお願いします。

AccessのVBAでExcelファイルをコピーしたり開いたり
テキストボックスの内容を書き換えたりしています。
Excelにてコントロールツールボックスから作成したコマンドボタンがあるのですが、このボタンのクリックイベントを
AccessのVBAから実行させる方法を探しています。
ちなみに訳あって標準モジュールに書かれているわけではないので
マクロを呼び出す方法は不可でした;;
標準モジュールに移すのは無しの方向で
どなたか分かる方いらっしゃいましたらお願いします。

Aベストアンサー

こんにちは。

最初の部分がどうなっているのか分かりませんが、
xlWb は、ブックのオブジェクトです。

xlWb.Worksheets("Sheet1").CommandButton1.Value = True

Clickイベントに限られますが、このようにすれば、実行できるはずです。

>訳あって標準モジュールに書かれているわけではないので
>標準モジュールに移すのは無しの方向で

ふつうは、標準モジュールに置かないです。しかし、複雑で大きなものは、シートモジュールには置かないほうがよいと思います。呼び出すなら、Call 標準モジュールマクロ でよいのですが、いずれ機を見て、移動させることも視野に入れたほうが良いです。複雑なものは修正の際に手間が掛かってしょうがないです。とはいえ、そう簡単にいかないのは承知の上です。


このカテゴリの人気Q&Aランキング

おすすめ情報