Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


390 / 500 ページ ←次へ | 前へ→

【5398】Re:同一名のテーブルが複数件存在
発言  T  - 05/6/17(金) 10:19 -

引用なし
パスワード
   >こんばんわ、お世話になります。
>Access95のMDBなんですが、同一名称のテーブルが複数存在しています。
>タイムスタンプはそれぞれ違うんですが、名称はまったく同じ。
>で、そのMDBを修復すると
>「・・・・・インデックスではありません」←(忘れてしまいました)
>みたいなダイアログが出て、MDBファイルが使えなくなってしまいます。
>これを直すにはどうしたらよいでしょうか?
>あと、このような状態になるのは何が原因なのでしょうか?
>VBAとは直接関係無いかもしれませんが
>よろしくお願いします。

具体的に書きます。
AというMDBのなかにBというテーブルがあります。
このBというテーブルはCというテーブル作成クエリーで作られます。
CはDというマクロで実行されます。
DのマクロでCを実行する前にメッセージの設定をいいえにして
ダイアログが表示されないようにしてあります。
通常ですとBテーブルはDマクロが実行されるたびに作り変えられますよね?
問題のMDBはBテーブルが作り変えられずに新たなBテーブルをMDB内に作成し
同じ名前のBというテーブルが複数存在しているように見えます。
この同じ名前のBというテーブルが複数存在しているMDBを最適化すると
Bというテーブルがなくなります。
この同じ名前のBというテーブルが複数存在しているMDBを修復すると
「'C:\xxxx\A.mdb'はこのテーブルのインデックスではありません。」
というダイアログが表示され、以後このMDBファイルは使用出来なくなります。

この現象について今、調べています。
業務で使用しているMDBなので、再発を防止しなければいけません。

Accessのバージョンは95です。
どなたか、ご存知の方いらっしゃいましたら、よろしくお願いいたします。
・ツリー全体表示

【5397】同一名のテーブルが複数件存在
質問    - 05/6/16(木) 21:08 -

引用なし
パスワード
   こんばんわ、お世話になります。
Access95のMDBなんですが、同一名称のテーブルが複数存在しています。
タイムスタンプはそれぞれ違うんですが、名称はまったく同じ。
で、そのMDBを修復すると
「・・・・・インデックスではありません」←(忘れてしまいました)
みたいなダイアログが出て、MDBファイルが使えなくなってしまいます。
これを直すにはどうしたらよいでしょうか?
あと、このような状態になるのは何が原因なのでしょうか?
VBAとは直接関係無いかもしれませんが
よろしくお願いします。
・ツリー全体表示

【5396】Re:縦方向(レコード)のデータを横方向(...
回答  小僧  - 05/6/16(木) 19:30 -

引用なし
パスワード
   ▼さつき さん:
ごめんなさい。ADOでしたね。

ADOには「FindFirst」メソッドがないので「Find」メソッドを使うか
「Filter」で新規か更新か判断する事になります。

以下参考にして下さい。

Public Function 横並び()

Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim cr As String
Dim I As Long
Dim J As Long

  Application.Echo False
  DoCmd.Hourglass True

  Set cn = Application.CurrentProject.Connection
  Set rs1 = New ADODB.Recordset
  Set rs2 = New ADODB.Recordset
 
  rs1.Open "list", cn, adOpenStatic, adLockReadOnly
  rs2.Open "listyoko", cn, adOpenKeyset, adLockOptimistic

  Do Until rs1.EOF
  
  If Not IsNull(rs1![区分].Value) Then
    
'フィルタを掛けて新規か追加か判断
    rs2.Filter = "契約者 ='" & rs1![契約者] & "'"
    
'データなし(新規)
    If rs2.EOF Then
      rs2.AddNew
      For I = 1 To 4
        rs2(I - 1) = rs1(I)
      Next I
'データあり(追加)
     Else
      J = 0
'空のフィールドを検索
      Do Until rs2(J) = "" Or IsNull(rs2(J))
        J = J + 1
      Loop
      
      For I = 0 To 2
        rs2(I + J) = rs1(I + 2)
      Next
    End If
'更新
    rs2.Update
  End If
  rs1.MoveNext
  Loop

'オブジェクトの解放
  rs1.Close: Set rs1 = Nothing
  rs2.Close: Set rs2 = Nothing
  cn.Close: Set cn = Nothing
End Function
・ツリー全体表示

【5395】Re:縦方向(レコード)のデータを横方向(...
質問  さつき  - 05/6/16(木) 17:52 -

引用なし
パスワード
   小僧さん、教えていただいてありがとうございます。

>下テーブルのフィールド数に変更がないのであれば
>ワーク用のテーブルとして使うのもありだと思われますが、
>上テーブルの結果によって可変するものであると
>下テーブルに伴うクエリ・フォーム・レポート・モジュールと
>大幅な変更が必要となってしまいます。

下テーブルのフィールド数に変更はありません。品目は7個までに限定できます。
ワーク用のテーブルとして使う形にしたいです。

>そのワークテーブルを何に使うのかによっては
>もうちょっと良い方法があるかもしれません。

ワークテーブルは契約者をキーに担当者テーブルと関連付けます。

>「rs2」に対して「FindFirst」メソッドを使い、
>結果が「Nomatch」プロパティの値が「True」でしたら「AddNew」で
>「False」でしたら「Edit」で開いて「Update」すれば良いと思われます。

下記のようにしてみましたが、
rs2.FindFirst "取引先名編集=" & cr 
のところで「コンパイルエラー メソッドまたはデータメンバが見つかりません」とでます。
どのようにしたらよいでしょうか?

Public Function 横並び()

Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim cr As String

  Application.Echo False
  DoCmd.Hourglass True 

  Set cn = Application.CurrentProject.Connection 
  Set rs1 = New ADODB.Recordset
  Set rs2 = New ADODB.Recordset
  
  rs1.Open "list", cn, adOpenStatic, adLockReadOnly
  rs2.Open "listyoko", cn, adOpenKeyset, adLockOptimistic
  Rst.MoveFirst

  keiyakusha = ""
  j = 1
   
  Do Until rs1.EOF

    If IsNull(rs1.Fields("区分").Value) = True Then
        rs1.MoveNext
    Else
      Set cr = rs1.Fields("契約者")
      rs2.FindFirst "契約者=" & cr
      If rs2.NoMatch = True Then
        j = 1
        rs2.AddNew
        rs2.Fields("契約者") = rs1.Fields("契約者")
        For i = 1 To 3
          rs2.Fields(j) = rs1.Fields(i)
          j = j + 1
        Next i
        rs2.Update
      ElseIf rs2.NoMatch = False Then
        j = 4
        rs2.Edit
        For i = 1 To 3
          rs2.Fields(j) = rs1.Fields(i)
          j = j + 1
        Next i
          j = j + 1
        rs2.Update
        keiyakusha = rs1.Fields("契約者").Value
      End If
    End If
  rs1.MoveNext
  Loop
  
  rs1.Close
  rs2.Close
  cn.Close
  
End Function
・ツリー全体表示

【5394】Re:★マークを区別して抽出したい。
回答  小僧  - 05/6/16(木) 15:09 -

引用なし
パスワード
   ▼Nao さん:
こんにちは。

>criteria = "星 Like '*" & Me!txt星 & "*'"

criteria = "星 = '" & Me!txt星 & "'"

でフィルタを掛ければ良いと思いますがいかがでしょう?
・ツリー全体表示

【5393】★マークを区別して抽出したい。
質問  Nao  - 05/6/16(木) 13:29 -

引用なし
パスワード
   フォーム上にテキストボックスを作り"txt星"そこから参照して
データーを抽出したいのですが、
サブフォーム内の星フィールドの データー(★・★★・★★★)
を区別がうまく出来なく
2つ星も3星も 含んで抽出してしまいます。
一つ星は 一つだけで抽出したいのですが?

Dim criteria As String 
  
  If IsNull(Me!txt星) Then
 
     criteria = "" 
  Else
    
     criteria = "星 Like '*" & Me!txt星 & "*'"
  End If
 
  Me!サブフォーム.Form.Filter = criteria
  Me!サブフォーム.Form.FilterOn = True


いい方法は無いでしょうか?
よろしくお願いします。
・ツリー全体表示

【5392】Re:縦方向(レコード)のデータを横方向(...
回答  小僧  - 05/6/16(木) 9:49 -

引用なし
パスワード
   ▼さつき さん:
おはようございます。

下テーブルのフィールド数に変更がないのであれば
ワーク用のテーブルとして使うのもありだと思われますが、
上テーブルの結果によって可変するものであると
下テーブルに伴うクエリ・フォーム・レポート・モジュールと
大幅な変更が必要となってしまいます。

ご提示されたのは例としてあげているとの事で実際どのようなデータが
入るかは解りませんが、そのワークテーブルを何に使うのかによっては
もうちょっと良い方法があるかもしれません。

下記コードについてですが、

>  Do Until rs1.EOF
>
>    If IsNull(rs1.Fields("区分").Value) = True Then
>        rs1.MoveNext
>    Else
>      If keiyakusha <> rs1.Fields("契約者").Value Then
>        j = 1
>        rs2.AddNew
>        rs2.Fields("契約者") = rs1.Fields("契約者")
>        For i = 1 To 3
>          rs2.Fields(j) = rs1.Fields(i)
>          j = j + 1
>        Next i
>        rs2.Update
>      Else
>        j = j + 4
>        rs2.AddNew
>        For i = 1 To 3
>          rs2.Fields(j) = rs1.Fields(i)
>          j = j + 1
>        Next i
>        rs2.Update
>      End If
>      keiyakusha = rs1.Fields("契約者").Value
>    End If
>  rs1.MoveNext
>  Loop

今のままですとうまくいかないと思いますので、

「rs2」に対して「FindFirst」メソッドを使い、
結果が「Nomatch」プロパティの値が「True」でしたら「AddNew」で
「False」でしたら「Edit」で開いて「Update」すれば良いと思われます。
・ツリー全体表示

【5391】Re:縦方向(レコード)のデータを横方向(...
質問  さつき  - 05/6/15(水) 18:07 -

引用なし
パスワード
   小僧 さんお久しぶりです。ご回答ありがとうございます。

>Accessになっちゃいましたか…。
いえいえ違います。小僧さんに以前教えていただいたExcelVBAはりっぱに活躍しております。大変業務が効率化して喜んでおります。ありがとうございました。
今回はまた別件です。わかりやすくするため、似たような例題にしましたが、実際はまったく違う目的で使います。
Accessでテーブルを作って、さらに他のテーブルとの関連付けをするため、今回はAccessVBAにしました。

>まず言ってしまうと、止めたほうが良いです。
>Accessに限らずデータベースにおいて、フィールドを増やす事は
>大幅な仕様変更を伴ってしまう場合があります。

最初からテーブル2の方に必要分だけフィールドを作っておいても難しいでしょうか?
・ツリー全体表示

【5390】Re:VBの参照設定(Excel)
お礼  smith E-MAIL  - 05/6/15(水) 17:52 -

引用なし
パスワード
   お二人ともありがとうございます。どちらともやってみます。
・ツリー全体表示

【5389】Re:縦方向(レコード)のデータを横方向(...
発言  小僧  - 05/6/15(水) 17:22 -

引用なし
パスワード
   ▼さつき さん:
こんにちは。
Accessになっちゃいましたか…。

>契約者ごとに購入品を横方向に並べるアクセステーブルを作らなければなりません。

まず言ってしまうと、止めたほうが良いです。
Accessに限らずデータベースにおいて、フィールドを増やす事は
大幅な仕様変更を伴ってしまう場合があります。

Excel の場合ですと縦横にデータを増やせますが、Accessの場合は
縦(レコード)のみと考えた方が良いです。

>佐藤  SONY   T05 10  TOSHIBA  N71 37 SONY R03 21
>加藤  HITACHI K23 25  TOSHIBA  M52  8
>神田  HITACHI L12 5  SONY   Q46  6
>中川  NATIONAL H95 12

こういったデータが必要な理由がレポートやExcelへの出力であるならば
クエリやオートメーションである程度は解決できると思われます。
・ツリー全体表示

【5388】Re:VBの参照設定(Excel)
回答  小僧  - 05/6/15(水) 16:47 -

引用なし
パスワード
   ▼smith さん:
こんにちは。

まず配布元のAccessの、エクセルへの参照設定を外します。

次に「Dim」「Public」等で宣言している変数でエクセルのオブジェクトを
使っているものを全て「Object型」で宣言します。

例) Dim xlsApp As New Excel.Appclication
   Dim xlsWkb As Workbooks
   Dim xlsSht As Worksheet
   Dim xlsRange As Range
               ↓
   Dim xlsApp As Object
   Dim xlsWkb As Object
   Dim xlsSht As Object
   Dim xlsRange As Object

「Application」をセットしている変数(上記ではxlsApp)の記述を

  Set xlsApp = CreateObject("Excel.Application")

とします。

この状態で今まで通りの作動するはずです。

Excelの参照設定をしていないため、Excelのバージョンに依存せずに
使うことができるようになります。

但し、Excel2000でしかサポートされていないメソッド等を使用した場合は
Excel97ではエラーとなります。
・ツリー全体表示

【5387】Re:VBの参照設定(Excel)
回答  Gin_II  - 05/6/15(水) 16:47 -

引用なし
パスワード
   >どちらでも動作するような参照設定は存在するのでしょうか。

[OFF2003] [INFO] オートメーションにおける事前バインディングおよび実行時バインディングの使用
http://support.microsoft.com/default.aspx?scid=kb;ja;245115

実行時バインディングを使っては?
・ツリー全体表示

【5386】VBの参照設定(Excel)
質問  smith E-MAIL  - 05/6/15(水) 16:34 -

引用なし
パスワード
   AccessのVBの参照設定に「Microsoft Excel9.0 object Library」を使っているのですが、Excel97が入っているパソコンで動かすとエラーになって参照不可になります。逆に参照設定に「Microsoft Excel8.0 object Library」を使って、Excel2000のパソコンで動かすとエラーになります。Excel8.0 = Excel97で、Excel9.0 = Excel2000だってことはわかっております。使用ユーザーは500人ほどで、Excel97とExcel2000が半々ぐらいです。どちらでも動作するような参照設定は存在するのでしょうか。
・ツリー全体表示

【5385】縦方向(レコード)のデータを横方向(フ...
質問  さつき  - 05/6/15(水) 16:21 -

引用なし
パスワード
   Access VBA初心者です。よろしくお願いいたします。

下記のように契約者の購入品レコードがあって、
区分  契約者 メーカー     品番    個数
1    佐藤  SONY     T05    10
2    加藤  HITACHI  K23   25
1    佐藤  TOSHIBA  N71   37
4    佐藤  SONY     R03   21
6    加藤  TOSHIBA  M52    8
1    神田  HITACHI  L12    5
2    中川  NATIONAL H95   12
3    神田  SONY     Q46    6

下のように契約者ごとに購入品を横方向に並べるアクセステーブルを作らなければなりません。
佐藤  SONY   T05 10  TOSHIBA  N71 37 SONY R03 21
加藤  HITACHI K23 25  TOSHIBA  M52  8
神田  HITACHI L12 5  SONY   Q46  6
中川  NATIONAL H95 12

下記のようにコードを書いてみましたが、rs2.Updateを実行することによって、行が変わってしまいます。どのようにしたらよいでしょうか。

  Do Until rs1.EOF

    If IsNull(rs1.Fields("区分").Value) = True Then
        rs1.MoveNext
    Else
      If keiyakusha <> rs1.Fields("契約者").Value Then
        j = 1
        rs2.AddNew
        rs2.Fields("契約者") = rs1.Fields("契約者")
        For i = 1 To 3
          rs2.Fields(j) = rs1.Fields(i)
          j = j + 1
        Next i
        rs2.Update
      Else
        j = j + 4
        rs2.AddNew
        For i = 1 To 3
          rs2.Fields(j) = rs1.Fields(i)
          j = j + 1
        Next i
        rs2.Update
      End If
      keiyakusha = rs1.Fields("契約者").Value
    End If
  rs1.MoveNext
  Loop
・ツリー全体表示

【5384】Re:マクロの実行について教えてください。
お礼  NEMOTAKE  - 05/6/15(水) 13:28 -

引用なし
パスワード
   クロ さんありがとうございます。
早速やってみます。
・ツリー全体表示

【5383】Re:マクロの実行について教えてください。
回答  クロ  - 05/6/15(水) 11:00 -

引用なし
パスワード
   DoCmd.RunMacro "マクロ1"
ですね。
・ツリー全体表示

【5382】マクロの実行について教えてください。
質問  NEMOTAKE  - 05/6/15(水) 10:25 -

引用なし
パスワード
   モジュールでクエリーを実行するときは
DoCmd.OpenQuery ”クエリー名”
ですがマクロを実行するときはどのように記述すればいいのでしょうか教えてください。
よろしくお願いします。
・ツリー全体表示

【5381】Re:Excelファイル範囲指定のインポート方法
回答  小僧  - 05/6/15(水) 9:55 -

引用なし
パスワード
   ▼sakaiII さん:
おはようございます。

※要参照設定 Excel x.x Object Library

Sub 範囲指定取込()
Dim xlsApp As New Excel.Application
Dim xlsWkb As Workbook
Dim xlsSht As Worksheet
Dim xName As String     'Excelブックのフルパス名
Dim xSheet As String    '取り込むシート名
Dim Kiten As Range
Dim EndCell As String
  
  xName = "C:\test.xls"
  xSheet = "Ken"
  
  Set xlsWkb = xlsApp.Workbooks.Open(xName)
  Set xlsSht = xlsWkb.Worksheets(xSheet)
  Set Kiten = xlsSht.Range("B5")
    EndCell = xlsSht.Cells(Kiten.END(xlDown).Row, _
                Kiten.END(xlToRight).Column).Address(False, False)
  Set Kiten = Nothing
  Set xlsSht = Nothing
  xlsWkb.Close: Set xlsWkb = Nothing
  xlsApp.Quit: Set xlsApp = Nothing

  DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
              "T_範囲取込", xName, True, xSheet & "!B5:" & EndCell

End Sub

取込元のExcelファイルや取込先のテーブルの存在チェックなどは行っていません。
・ツリー全体表示

【5380】Re:Excelファイル範囲指定のインポート方法
質問  sakaiII  - 05/6/14(火) 20:47 -

引用なし
パスワード
   小僧さん:
 いつもお世話になっております。
取り込みたいファイル:第一行から第四行までとA列はデータの説明文です。
           フィールドの数が可変ですが、縦方向のサイズ、
           つまりレコードの数は366(フィールド行を含む)を
           超えないです。このようなデータを取り込みするため、
           どうすればいいでしょうか?
           ご伝授ください。
・ツリー全体表示

【5379】Specification Nameについて
お礼  和光TH  - 05/6/14(火) 18:02 -

引用なし
パスワード
   小僧さん

大変有難うございました。
・ツリー全体表示

390 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1084740
(SS)C-BOARD v3.8 is Free