人に聞けない痔の悩み、これでスッキリ >>

0



.

Access2000のデータからExcel2013にデータを抽出する方法を教えて下さい。

C:\JRA\Accessに
「2014.mdb」と「出馬表当日.xls」が保存されています。
           ↓
       SheetDBのC列、D列、E列、F列を抽出項目とします。

「出馬表当日.xls」のSheetDBのC列に騎手名、D列には0か1、E列には4桁の数字、F列には漢字2文字が並んでいます。これを抽出項目にしたいのです。

行番号,C列,D列,E列、F列
↓, ↓, ↓, ↓                             
01柴山雄一,1,1200,東京
02伊藤工真,1,1200,東京
03松岡正海,1,1200,東京
04黛弘人,1,1200,東京
05
06吉田豊,0,1800,阪神
07北村宏司,0,1800,阪神
08浜中俊,0,1800,阪神
09
10大野拓弥,0,2200,京都
11赤岡修次,0,2200,京都
12岩田康誠,0,2200,京都
13
14石川裕紀人,1,2000,小倉
・・・・・・・・・

上の場合、01~04の条件でAccess2000のデータから抽出したものをひとつのシート(1R)に、06~08の条件で抽出したものを別のシートに(2R)、.....と空白行ごとに抽出して、その結果を「出馬表当日.xls」にシートを変えて貼り付けたいのです。
空白行から空白行までは最大18名分入っています。
名前とD列(0か1)、E列(4桁の数字)の数字、F列(漢字2文字)をAccessの抽出項目とします(Access2000のフィールドは13あってその6番目に名前、3番目に「0か1」5番目に「4桁の数字」13番目に「漢字2文字」が入っています)。
この(最大)18名の名前と2種類の数字をAccessの抽出項目として、Excel2013に抽出したいのです。
以前、名前のみでの抽出を教えていただいたのですが、2種類の数字を条件として追加すべく頑張りましたが、さっぱり分からず、再度投稿させていただきました。
http://oshiete.goo.ne.jp/qa/8838454.html
よろしくお願いします。

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

A 回答 (2件)

あれ? 教えて!goo って変わったんですね?



QA 全部見たいので、bekkoame の方で閲覧していました。
広告表示もないし・・・ 10 件以上が1度に見れるし・・・
最近、回答行為は、チョッと違うかな?っていう方がおられたので控える事に・・・

久々に 教えて!goo から見ると、質問の項目がいろいろ違うみたいで・・・


SQL 部分を変更してみました。(CSQL / sSql 操作部分)
他部分は、ほぼ前のままです。

今回のSQLでは、Excelシート SheetDB を直接参照します(AS Q2 として)
C ~ F 列を、F1 ~ F4 として参照できます。
この方法は、前回ご質問での #2 の回答を発展させたものになります。
前回同様、エラーとかになったらスルーしてください。

下記 ★6、★3、★5、★13、部分をテーブル 2014 にあるフィールド名に変更して試してみてください。


Public Sub Samp3()
  Dim cn As Object, rs As Object
  Dim sSql As String, sS As String
  Dim v As Variant
  Dim iRow As Long, iRowN As Long, iR As Long
  Dim i As Integer
  Const adStateOpen = 1
  Const PN2007 As String = "Microsoft.ACE.OLEDB.12.0"
  Const PN2003 As String = "Microsoft.Jet.OLEDB.4.0"
  Const CMDB As String = "\2014.mdb"
  Const CSQL = "SELECT Q1.* FROM 2014 AS Q1 INNER JOIN " _
      & "(SELECT * FROM [SheetDB${%1}] IN '{%2}'[Excel 8.0;HDR=NO]) AS Q2 " _
      & "ON Q1.★6=Q2.F1 AND Q1.★3=Q2.F2 AND Q1.★5=Q2.F3 AND Q1.★13=Q2.F4;"

  On Error Resume Next
  Set cn = CreateObject("ADODB.Connection")
  For Each v In Array(PN2007, PN2003)
    cn.Open "Provider=" & v _
      & ";Data Source=" & ThisWorkbook.Path & CMDB
    If (cn.State = adStateOpen) Then Exit For
  Next
  If (IsEmpty(v)) Then
    MsgBox "環境不足で処理中断", vbCritical
    Set cn = Nothing
    Exit Sub
  End If
  On Error GoTo 0

  Application.ScreenUpdating = False
  With Worksheets("SheetDB")
    iR = 1
    iRow = 1
    While (.Cells(iRow, "C") <> "")
      sSql = Replace(CSQL, "{%2}", ThisWorkbook.FullName)
      iRowN = iRow
      With .Cells(iRow, "C")
        If (.Offset(1) <> "") Then iRowN = .End(xlDown).Row
        sSql = Replace(sSql, "{%1}" _
          , .Resize(iRowN - iRow + 1, 4).Address(False, False))
      End With

      sS = iR & "R"
      For Each v In Worksheets
        If (v.Name = sS) Then Exit For
      Next
      If (IsEmpty(v)) Then
        With Worksheets.Add(After:=Worksheets(Worksheets.Count))
          .Name = sS
        End With
      Else
        v.Activate
        Cells.ClearContents
      End If

      Set rs = cn.Execute(sSql)
      If (Not rs.EOF) Then
        With Range("A1")
          For i = 0 To rs.Fields.Count - 1
            .Offset(, i) = rs(i).Name
          Next
          .Offset(1).CopyFromRecordset rs
        End With
      End If
      Columns.AutoFit ' 列幅を調整してみた
      rs.Close
      Set rs = Nothing
      iRow = iRowN + 2
      iR = iR + 1
    Wend
    .Activate
  End With
  cn.Close
  Set cn = Nothing
  Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

早速の御回答ありがとうございます。
一発でできました。「凄い!」の一言です。
gooは最近変わったようです。使い辛くなりました。
もう一点甘えてもいいですか。
追加された各シートの1行目を「先頭行の固定」+「フィルタ設定」するにはどうすればよいか教えていただけないでしょうか。
よろしくお願い致します。

お礼日時:2015/02/13 00:06

#1です



動きましたか・・・
じゃぁ、前回エラーだったのはシート名が違っていたりしたんでしょうかね。

> 追加された各シートの1行目を「先頭行の固定」+「フィルタ設定」するにはどうすればよいか教えていただけないでしょうか。

これ、ご自分で操作できるのであれば、「マクロの記録」を使ってみるのも良いかも。
「先頭行の固定」+「フィルタ設定」を 2007 でやってみると、以下が記述されます。

Sub Macro1()
'
' Macro1 Macro
'

'
  With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
  End With
  ActiveWindow.FreezePanes = True
  Selection.AutoFilter
End Sub

この記述されたものを、違うシートでステップ実行してみます。
すると、ウィンドウを分割してから枠を固定している事がわかります。
この動きで良ければ、このままの記述を組み込んでいけば良いです。
私が知っている枠固定の方法は別にあって、

  Range("B2").Activate
  ActiveWindow.FreezePanes = True

とすると、アクティブセルの上側・左側を固定するというもの。
上記は、B2 を指定しているので、1行目と A 列が固定に・・・
今回は1行目だけなので、左側が無い A2 を指定すれば・・・良いですね

で、Samp3 に組み込んでいきますが、フィルタの設定
  Selection.AutoFilter
は、それなりに項目が記述されていないとエラーになるみたいなので、抽出したものを転記した後

        End With
        Range("A2").Activate ' ★
        ActiveWindow.FreezePanes = True ' ★
        Selection.AutoFilter ' ★
      End If
      Columns.AutoFit ' 列幅を調整してみた

これで、終了・・・でも良いですが、
現状、抽出を繰り返す=シートの使い回し になっています。
前回、何件か抽出されていて、今回0件ならシートは空白になりますが、枠固定が残ってしまう事に・・・

      Else
        v.Activate
        Cells.ClearContents
        ActiveWindow.FreezePanes = False ' ★
      End If

上記部分で、枠固定を解除する様にしといた方が良いかも。
オートフィルタは、Cells.ClearContents することで解除されるみたい・・・?



> もう一点甘えてもいいですか。

動いた・・・とかの後に、追加質問があった場合、
おそらく他の方は回答してこないと思うので、急を要する場合などは別質問にした方が良いかも?
しかも、内容的には Excel のカテゴリになる?
Excel に関しての回答者さんは、Access より多いかな?

私のわかる範囲で追加等には応えていこうとは思っていますけど・・・
自分でやったのと、聞いただけのものなら、後々自分でやった方を覚えている?のかな?
    • good
    • 0
この回答へのお礼

いろいろとありがとうございました。
追加質問にまでお答えいただき感謝に堪えません。
早朝にもかかわらず、ありがとうございました。
30246kiku さんが見てくれれば一発なのになぁと思っていたら、本当に見ていただけるとは。
無事、解決しました。
まだまだインフルエンザが猛威を振るっているそうですので、お体にはお気を付け下さい。
本当にありがとうございました。

お礼日時:2015/02/13 07:29

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

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

関連するカテゴリからQ&Aを探す

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

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

QAccessからExcelへの条件付エクスポート

お世話になります。
Access2000で住所録を作成し、運用しております。
普段はデータをフリガナ、会社名、市町村で検索し、表示しているのですが
この時に使用した、検索条件をそのまま使って、得られたデータをExcelに
エクスポートしたいのです。
(検索は、サブフォームの一覧表示部に各検索条件でフィルタをかけるという方法で行っています。)
テーブル作成クエリなどいろいろ試してみたのですが、なかなかうまくいきません。
良い方法をご存知の方いらっしゃいましたら、よろしくお願いします。

Aベストアンサー

テーブル作成クエリで抽出したものをテーブルに出来たらあとはコードで出来ます。
ただし、
1.エクスポート先のEXCELファイルは既にある前提です。ここでは仮にC:\Windows\デスクトップ\Expo.xlsというファイルのDataという名前のシートににエクスポートするとします。

2.VBAでDAOを使用しますが、2000の場合標準がADOになっていますので、ビジュアルベーシックエディターのツールメニューの参照設定からDAOの一番新しそうなヴァージョンのやつにチェックマークをつけておいてください。(ADOでやればいいのでしょうが私の知識が古いのでDAOしか使えないのです。)

3.抽出して作成したテーブルの名前はT_抽出Dataと仮にしておきます。
4.どれかのフォームにコマンドボタンを作成して、そのクリック時のイベントプロシージャに次のようなコードを書きます。

Private Sub ボタン_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim appExcel As Object
Dim Worksheets As Object
Dim I As Integer '行番号

Set db = CurrentDb
Set rs = CurrentDb.OpenRecordset("T_抽出Data")

'エクセルオブジェクト生成
Set appExcel = GetObject("C:\Windows\デスクトップ\Expo.xls")
Set Worksheets = appExcel.Worksheets("Data")

'作業中はエクセルシートを非表示
appExcel.Parent.Windows(appExcel.Name).Visible = False

With Worksheets

'データ追加ループ
Do Until rs.EOF = True
.Cells(I, 1) = rs.Fields("フィールド名")
.Cells(I, 2) = rs.Fields("フィールド名")
.Cells(I, 3) = rs.Fields("フィールド名")
.Cells(I, 4) = rs.Fields("フィールド名")
rs.MoveNext
I = I + 1
Loop

End With

appExcel.Parent.Windows(appExcel.Name).Visible = True

'エクセルブックを閉じる
appExcel.Close True

' オブジェクトの参照を解放
Set Worksheets = Nothing
Set appExcel = Nothing

MsgBox ("エクセルへの出力が終了しました")
End Sub

実は私も以前、教えてgooで同じような質問をして、別の人にこのコーディングを教えてもらいました。

テーブル作成クエリで抽出したものをテーブルに出来たらあとはコードで出来ます。
ただし、
1.エクスポート先のEXCELファイルは既にある前提です。ここでは仮にC:\Windows\デスクトップ\Expo.xlsというファイルのDataという名前のシートににエクスポートするとします。

2.VBAでDAOを使用しますが、2000の場合標準がADOになっていますので、ビジュアルベーシックエディターのツールメニューの参照設定からDAOの一番新しそうなヴァージョンのやつにチェックマークをつけておいてください。(ADOでやればい...続きを読む

Q〔VBA・マクロ〕EXCELからACCESSデータをひっぱるには?

当方のレベルはアクセス初級者(基本的な操作)、
エクセルはごく簡単なVBAをいじる中級者です。

アクセスにて顧客マスター、商品マスターを作成しています。
エクセルで納品書を作成しています。

現状では外部データの取り込みをつかって
エクセルシートに顧客データ(シート1)と商品データ(シート2)を
取り込んだ後に、納品書(シート3)でシート1、2に
VLOOKUP関数をかけて、納入先と商品情報を
伝票におとしこんでいます。

こんなまどろっこしいことをせずに、
エクセルからアクセスのテーブルへ直接データを取り込む方法は
ないものでしょうか?

どなたかよろしくお願いいたします。

Aベストアンサー

>当方のレベルはアクセス初級者(基本的な操作)、
>エクセルはごく簡単なVBAをいじる中級者です。

Accessのレポートと言う方向になっていますが、
この条件でしたら、エクセルで帳票もありだと思います。

その理由は、
・mdbからデータを引っ張るのはVBA+ADOを使えばそれほど難しくない。
 Ecxel VBA経験者なら大丈夫でしょう。

・Excelの方が表現力が豊かなので、最終的な帳票の見栄えは良い。
 もちろん、作りこめばの話ですが・・・。

・ADOに慣れることは、今後VB等の他の開発言語を使う際に役立つ。
 そういう機会が有ればの話ですが・・・。

Excel帳票のメリットは他にも
・帳票をExcel形式で保存できるので、後から簡単に加工できる。
・メールで送ったりも出来る。
 (Accessは持っていないが、Excelは持っている、という人は多い)


もちろん、Accessの勉強のためレポートを使うのもありだと思いますし、
その方が簡単かもしれません。

参考のため、Excelでの方法を書いてみます。
どちらを選択するかは、お好みで。

****Excel VBA+ADO で mdbファイルからデータを取り込む例****

まずAccessの方で、帳票用のクエリを作ります。
データの入っているテーブルと、マスターテーブル等を結合して、並び順なども指定しておきます。この辺りはデータベースの方が便利ですので、ExcelのVLOOKUP関数は使わない方向で・・・。

データベースを扱う上でSQL文(クエリ)の学習は必須です。SQL文は標準化されていますので、Access以外のデータベースでも応用が利きます。覚えておいて損はないと思います。

 SQL  SELECT  INNER JOIN

上記のキーワードを検索すれば必要な情報は見付かると思います。この辺りが、データベースを扱う際の、最初の難関でしょう。

もっと具体的な情報が必要でしたら、テーブルの構造(テーブル名、フィールド名、主キー)を補足してください。


次に、Excelの準備ですが、VBAの画面で[ツール]→[参照設定]を開き

 Microsoft ActiveX Data Objects 2.7 Libray

を選択しておきます。(バージョンは多少異なるかも。最新の物を選択)

----サンプルソース----
 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 
 Dim dbName As String
 Dim dbPath As String
 
 dbName = "db1.mdb" 'MDBファイル名
 dbPath = ActiveWorkbook.Path & "\" 'MDBのPath 今回は ExcelのBook と同じフォルダを指定

 ' MDB との接続を確立する。決まり文句です。
 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & dbPath & dbName & ";"

 'レコードセットを開く。今回は"Q1"というクエリを参照のため開きます。
 'この部分で、SQL文を指定することも可能です。
 rst.Open "Q1", cnn, adOpenForwardOnly, adLockReadOnly
 
 'レコードが無くなるまで繰り返します。
 Do Until rst.EOF
  
  'Recordset![フィールド名]で各フィールドのデータを参照できます。
  Debug.Print rst![ID], rst![DATA]
  
  rst.MoveNext '次のレコードに移動します。
 Loop
 
 rst.Close
 cnn.Close
 Set cnn = Nothing
 Set rst = Nothing
----------------------

これだけのコードでデータベースのデータを参照できます。
後は、ExcelのVBAの知識があれば帳票を作ることは可能でしょう。
(この部分が多少面倒かも・・・(^^;、Accessのレポートにするか悩むところです)

ADOに関しては、Webで検索すれば解説しているサイトは見付かると思いますので、詳しくはそちらで。

>当方のレベルはアクセス初級者(基本的な操作)、
>エクセルはごく簡単なVBAをいじる中級者です。

Accessのレポートと言う方向になっていますが、
この条件でしたら、エクセルで帳票もありだと思います。

その理由は、
・mdbからデータを引っ張るのはVBA+ADOを使えばそれほど難しくない。
 Ecxel VBA経験者なら大丈夫でしょう。

・Excelの方が表現力が豊かなので、最終的な帳票の見栄えは良い。
 もちろん、作りこめばの話ですが・・・。

・ADOに慣れることは、今後VB等の他の開発言語を...続きを読む

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む

QACCESS クエリの抽出項目をEXCELから

Access2000のクエリの抽出項目をExcel2013の内容を抽出項目として指定するにはどうすればよいでしょうか。

Excelには、
佐藤
田中
鈴木
.........
のように縦に名前が最大18名分入っています。

この(最大)18名の名前をAccessの抽出項目とします(フィールドは10あってその6番目に抽出項目を18名分入力したいのです)。
18名を一人一人コピペしていたのですが、何とか簡素化できないものかな?と思っています。

できれば、マクロで一発で抽出項目を貼り付けたいのですが。
よろしくお願いします。

Aベストアンサー

#7です

修正量がそう多くなかったので回答してみます。

修正点
・ハイパーリンクしない
・出来上がるシート名は「1R」「2R」・・・「xR」
・抽出内容が無くてもシートは初期化する
・騎手名は C1 から始まり、終了は空白が2行続いたら
 (24 に限定せず、書かれていた分を処理する)


Public Sub Samp2()
  Dim cn As Object, rs As Object
  Dim sSql As String, sS As String
  Dim v As Variant
  Dim iRow As Long, iRowN As Long, iR As Long
  Dim i As Integer
  Const adStateOpen = 1
  Const PN2007 As String = "Microsoft.ACE.OLEDB.12.0"
  Const PN2003 As String = "Microsoft.Jet.OLEDB.4.0"
  Const CMDB As String = "\2014.mdb"
  Const CSQL = "SELECT * FROM 2014 WHERE 騎手名 IN ('{%1}');"

  On Error Resume Next
  Set cn = CreateObject("ADODB.Connection")
  For Each v In Array(PN2007, PN2003)
    cn.Open "Provider=" & v _
      & ";Data Source=" & ThisWorkbook.Path & CMDB
    If (cn.State = adStateOpen) Then Exit For
  Next
  If (IsEmpty(v)) Then
    MsgBox "環境不足で処理中断", vbCritical
    Set cn = Nothing
    Exit Sub
  End If
  On Error GoTo 0

  Application.ScreenUpdating = False
  With Worksheets("SheetDB")
    iR = 1
    iRow = 1
    While (.Cells(iRow, "C") <> "")
      iRowN = iRow
      With .Cells(iRow, "C")
        If (.Offset(1) <> "") Then iRowN = .End(xlDown).Row
        v = WorksheetFunction.Transpose(.Resize(iRowN - iRow + 1))
      End With
      If (IsArray(v)) Then
        sSql = Replace(CSQL, "{%1}", Join(v, "','"))
      Else
        sSql = Replace(CSQL, "{%1}", v)
      End If

      sS = iR & "R"
      For Each v In Worksheets
        If (v.Name = sS) Then Exit For
      Next
      If (IsEmpty(v)) Then
        With Worksheets.Add(After:=Worksheets(Worksheets.Count))
          .Name = sS
        End With
      Else
        v.Activate
        Cells.ClearContents
      End If

      Set rs = cn.Execute(sSql)
      If (Not rs.EOF) Then
        With Range("A1")
          For i = 0 To rs.Fields.Count - 1
            .Offset(, i) = rs(i).Name
          Next
          .Offset(1).CopyFromRecordset rs
        End With
      End If
      rs.Close
      Set rs = Nothing
      iRow = iRowN + 2
      iR = iR + 1
    Wend
    .Activate
  End With
  cn.Close
  Set cn = Nothing
  Application.ScreenUpdating = True
End Sub

#7です

修正量がそう多くなかったので回答してみます。

修正点
・ハイパーリンクしない
・出来上がるシート名は「1R」「2R」・・・「xR」
・抽出内容が無くてもシートは初期化する
・騎手名は C1 から始まり、終了は空白が2行続いたら
 (24 に限定せず、書かれていた分を処理する)


Public Sub Samp2()
  Dim cn As Object, rs As Object
  Dim sSql As String, sS As String
  Dim v As Variant
  Dim iRow As Long, iRowN As Long, iR As Long
  Dim i As Integer
  Const adStateOpen = 1...続きを読む

QExcel VBAからAccessマクロを実行したい

Excel VBAからAccessマクロを実行する方法を知っている人がいましたら
教えてください。
よろしくおねがいしまっす!

Aベストアンサー

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'マクロの実行
objAccess.DoCmd.RunMacro "メッセージ"

''ACCESSクローズ
objAccess.CloseCurrentDatabase
Set objAccess = Nothing

----------------------------------------------------------------------

もっと良い方法があるのかもしれません

参考にしてみてください。

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'...続きを読む

QEXCEL VBAでACCESSのデータを扱いたい(初心者です)

EXCEL VBAを勉強している者です。VBAでコードを書いてACCESSのデータを抽出してEXCELでその抽出したデートを加工したい(すべてVBAでコードを書いて処理)のですが、よくわかりません。EXCEL VBAの書籍を数冊勉強したのでEXCELの中だけでデータを作ったり、加工したりは理解できているつもりです。ただ、今まで読んだ書籍には外部データベースに接続して、その後、処理をするといったことが書いてなかったので、まったく知識がありません。そこで、ACCESSへの接続の仕方、操作の仕方などについて、やさしく(私みたいな初心者でも理解できる)説明してあるサイトまたは書籍をご存知の方、お教えください。特に、今のところ、最初の接続のところがわからないので接続について詳しく説明してあるサイトなどお願いします。

Aベストアンサー

初めまして。
↓のサイトはいかがでしょうか?データベース操作という項目の中にデータを取得する方法が書かれています。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130.html

但し、ACCESS VBAとSQLの知識も必要になると思うので、下記のサイトを参考にしてみて下さい。
ACCESS VBA:http://www.accessclub.jp/vbakaisetu/index.html
SQL:http://www.accessclub.jp/sql/index.html

Qアクセス等のデータをエクセルに抽出

アクセス等のデータをエクセルに抽出する方法

外部データの取り込みからデータを抽出する方法は分かったのですが、この方法ではなく

エクセル内のとあるセルに製品番号を入力すると、その番号に対応するデータ(製造日、加工条件等)がエクセルに出力できるようなツールを作成したいです。(例のような製造での利用を考えています)
テーブルが複数ある状態でも、テーブルごとにデータを出力できるようであればなおよいです。(各テーブルにつき1つのシートで出力といったイメージ)

わかりずらい表現で申し訳ありませんが
もしわかる方がいらっしゃったら教えていただきたいです。
よろしくお願いします。

Aベストアンサー

Accessのファイル(mdb)をExcel から ADOを使って接続。
該当のレコードセット(テーブルと思ってもらってよいです)を開き、レコード操作をして、条件に該当するレコードを抽出→セルなどに出力するとよいです。

QACCESSでVBAから選択クエリの抽出条件を指定したい

選択クエリの抽出条件はデザインビューの「抽出条件」欄に直接条件式を書き込むのが普通だと思いますが、この条件式をVBAで記述することは出来るでしょうか?

DoCmd.RunSQL ではアクションクエリしか実行できないようだし、
DoCmsOpenQuery では引数に抽出条件を指定することが出来ないし困っています。

Aベストアンサー

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてます(^^)

ちなみに、
Me.
と打ち込んだ時点でオートコンプリート(名称あってるかな~)
機能が働いて参照できるオブジェクトが表示される
はずです。
その中にKojiさんが書いた埋め込みオブジェクトが
きっとあるはず
もしかすると"FormA"とか名前を付けたつもりでも
Visual Basic Editor君が気を利かせて
Form_formA
とかになってる場合があります。
最近やってないんでうろ覚えなんですが、こんな処を注意すれば大丈夫!

追伸
このコードって検索とかで使えますから
覚えておくときっと役に立ちますよ♪

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてま...続きを読む

Q"パラメータが少なすぎます。1を指定して下さい。"

Access97を使用しています。

SQLで組んだモジュール中に
"実行時エラー '3061'"
"パラメータが少なすぎます。1を指定して下さい。"
と表示されます。

デバッグをクリックすると下記2行目が黄色になります。

Set Database = CurrentDb
Set Table = Database.OpenRecordset("選択クエリー", dbOpenDynaset, dbReadOnly) ←

情報が少ないかもしれませんが、何故このようなメッセージが出るのでしょうか?

Aベストアンサー

選択クエリーの中に、抽出条件がパラメータを指定するかたちで入力されていると、このようになることがあります。

つまり、クエリ内のあるフィールドの抽出条件が、

Between 100 And 200

という風に値をはっきりと指定したかたちではなくて、例えば…

Between [開始IDを入力してください] And [終了IDを入力してください]

Between [Forms!][フォーム名]![テキストボックス名] And [Forms!][フォーム名]![テキストボックス名]

みたいな感じで、ユーザーに値を入力させたり、フォームのテキストボックスの値を流用するみたいになってると、値がすぐに定まらないせいか(?)、OpenRecordsetを使うとご質問のようなエラーになります。(単純にクエリをダブルクリックで開くだけとか、Docmdでクエリを開く場合ならエラーになりません。OpenRecordsetを使ってクエリを開こうとするとエラーになります。)

回避する方法としては、●直接VBA内でSQLを書いて、パラメータ部分を変数などを使って直接値を指定してレコードセットを取り出す…などで行けると思うのですが、それ以外にも簡単な方法があるので、以下のURLを参照してみてください。

http://ws.31rsm.ne.jp/~pension/access/tips/benri1.htm#parameter

もし意味が違ってたらごめんなさい。

選択クエリーの中に、抽出条件がパラメータを指定するかたちで入力されていると、このようになることがあります。

つまり、クエリ内のあるフィールドの抽出条件が、

Between 100 And 200

という風に値をはっきりと指定したかたちではなくて、例えば…

Between [開始IDを入力してください] And [終了IDを入力してください]

Between [Forms!][フォーム名]![テキストボックス名] And [Forms!][フォーム名]![テキストボックス名]

みたいな感じで、ユーザーに値を入力させたり、フォームのテキ...続きを読む

QACCESS Excelの出力について

stressmanといいます。

実は、ACCESSでクエリをExcelへ出力をしたいのですが、
ここで、既存のExcelのファイルのセルを指定して出力
というこはできるのでしょうか?

選択クエリで必要な情報を抜き出し、そのクエリを
「営業報告書.xls」というファイルのあらかじめ記載して
ある「顧客名」「住所」のセルに格納していきたいのです。

マクロで「コマンド実行」-「Excel出力」を使って
みたのですが、新しくファイルを開き、クエリのデザイン
そのままで出力されます。

宜しくお願いします。

Aベストアンサー

たぶんSQL文に間違いがあります。抽出条件で、テーブルの項目名が違ってませんか?

それと、項目の数値タイプか文字タイプかもチェックしてください。

例えば、文字項目でしたら「項目A=”条件”」とダブルクォテーションでくくらなければなりません。

100%作成されたSQL文に誤りがありますので、チェックされてくださいね。


人気Q&Aランキング