Access VBA質問箱 IV

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

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


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

【6757】Re:【至急】テーブルリンクについて
質問  tomono  - 05/11/7(月) 10:35 -

引用なし
パスワード
   返信が遅くなって申し訳ございません。
反応ありがとうございます!

>oracle と access のバージョンは何ですか?
oracle9iとaccsess2003です。

解決できますでしょうか?よろしくお願いします。
・ツリー全体表示

【6756】Re:SeekとArray
質問  山田  - 05/11/7(月) 9:54 -

引用なし
パスワード
   全てのモジュールです。
宜しくお願いします。

Public Sub WT_予算B_作成()
Dim cN As ADODB.Connection
'費目マスタ
Dim rsH As ADODB.Recordset
'出張所マスタ
Dim rsSB As ADODB.Recordset
'メインテーブル
Dim rsTB As ADODB.Recordset
'ワークテーブル
Dim rsWB As ADODB.Recordset
Dim xSQL1 As String
Dim xSQL2 As String

Set cN = CurrentProject.Connection
Set rsH = New ADODB.Recordset
Set rsSB = New ADODB.Recordset
Set rsTB = New ADODB.Recordset
Set rsWB = New ADODB.Recordset
Set rsGBB = New ADODB.Recordset

rsH.Open "SELECT T_費目マスタ.* FROM T_費目マスタ " & _
     "WHERE (((T_費目マスタ.除)<>1));", cN, adopkeyset, adLockReadOnly

rsSB.Open "SELECT T_出張所マスタ.* FROM T_出張所マスタ " & _
     "WHERE (((T_出張所マスタ.除)<>1));", cN, adopkeyset, adLockReadOnly
     
rsTB.Open "SELECT T_予算B.* FROM T_予算B " & _
     "WHERE (((T_予算B.期)=DLookUp('期','T_管理マスタ','ID=1')));", cN, adopkeyset, adLockOptimistic

rsWB.Open "WT_予算B", cN, adopkeyset, adLockOptimistic

'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'WT_予算Bを初期化
'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
xSQL1 = "DELETE WT_予算B.* FROM WT_予算B;"

DoCmd.RunSQL xSQL1

'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'T_予算BのデータをWT_予算Bに昨期予算を出張所編成に合わせて合計したデータを追加
'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
xSQL2 = "INSERT INTO WT_予算B ( 期, 出張所CD, 費目CD, 営現CD, 今1, 今2, 今3, 今4 ) " & _
    "SELECT DLookUp('期','T_管理マスタ','ID=1') AS 新期, T_出張所マスタ.集計CD, T_予算B.費目CD, T_予算B.営現CD, Sum(T_予算B.今1) AS 今1の合計, Sum(T_予算B.今2) AS 今2の合計, Sum(T_予算B.今3) AS 今3の合計, Sum(T_予算B.今4) AS 今4の合計 " & _
    "FROM T_出張所マスタ INNER JOIN T_予算B ON T_出張所マスタ.出張所CD = T_予算B.出張所CD " & _
    "WHERE (((T_予算B.期) = DLookup('期', 'T_管理マスタ', 'ID=1') - 1)) " & _
    "GROUP BY T_予算B.期, T_出張所マスタ.集計CD, T_予算B.費目CD, T_予算B.営現CD;"
   
DoCmd.RunSQL xSQL2

'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'WT_予算BのデータをT_予算Bを追加
'〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

rsWB.MoveFirst

Do Until rsTB.EOF

rsTB.MoveFirst

rsTB.Seek Array(rsWB![期], rsWB![出張所CD], rsWB![費目CD], rsWB![営現CD]), adSeekFirstEQ

If rsTB.EOF Then
   rsTB.AddNew
   rsTB![期] = rsWB![期]
   rsTB![出張所CD] = rsWB![出張所CD]
   rsTB![費目CD] = rsWB![費目CD]
   rsTB![営現CD] = rsWB![営現CD]
   rsTB.Update
End If
   rsWB.MoveNext
Loop

rsH.Close
rsSB.Close
rsTB.Close
rsWB.Close
cN.Close

End Sub
・ツリー全体表示

【6755】Re:【解決】Re:エクセル出力
発言  小僧  - 05/11/6(日) 22:19 -

引用なし
パスワード
   ▼Mino さん:
ごめんなさい。蛇足ですが…。

>CSV は TransferText を使用しております。

CSV ファイルは Excel 以外のアプリケーションでも表示できます。
(メモ帳やフリーのテキストエディタなど)

検証してみたところ、メモ帳で開いている CSVファイル を
更に Excel で開いてみましたが読み取り専用にならない様でした。

ユーザがどのアプリケーションで開いていても対策のできるように
YU-TANG さんの ユーザ関数にあるように Open ステートメントを使った方が
良いかもしれませんね。
・ツリー全体表示

【6754】Re:【解決】Re:エクセル出力
回答  小僧  - 05/11/6(日) 20:05 -

引用なし
パスワード
   >>>更には、次にエクセルを起動しようとすれば、起動できなくなっています。
>>>(タスクマネージャーからEXCELを終了させれば、起動出来ましたが・・・)
>>こちらについては原因が 2 点考えられます。
>>1) 上位オブジェクトからの参照ができていない。
>>2) オブジェクトの解放がうまくいっていない。
>この場合は、エラーとなってしまうので、2) でしょうか。

1) の場合でもエラーが出ずに、タスクにマネージャーに Excel の残骸が出来る事があります。

先ほどご提示されたコードには特に 1) に該当する所はなさそうなのですが、

>  Exl.Workbooks.Open FileName:=「パス名+ファイル名」
>  Exl.Workbooks(「ファイル名」).Activate
>  If Exl.ActiveWorkbook.ReadOnly Then

この 3行目を
   If ActiveWorkbook.ReadOnly Then

などとしてしまうと、余計な Excel のインスタンスが形成されてしまい、
残骸が残ってしまう事となります。

当方が気になるのは 2) の方なのですが、

>    Exl.ActiveWorkbook.Close
>    Set Exl = Nothing
>    Exit Function

Exl.Visible = True

を指定して実行すると解りやすいと思うのですが、
Excel.Application は起動されたままになっていますね。

>    Exl.ActiveWorkbook.Close
'追加  
     Exl.Quit
>    Set Exl = Nothing

とすると、うまくインスタンスの解放ができると思います。
(コードの 1部しかご提示されておりませんので、他にも原因があるかもしれませんが)


既に手遅れとなってしまっているかもしれませんが、

>更には、次にエクセルを起動しようとすれば、起動できなくなっています。

とい状態を何回も繰り返していると、
Excel ファイルそのものがおかしくなってしまう事もあります…。
バックアップをこまめにとって大切なファイルを壊さないように気をつけて下さい。
・ツリー全体表示

【6753】Re:【解決】Re:エクセル出力
回答  小僧  - 05/11/6(日) 19:53 -

引用なし
パスワード
   ▼Mino さん:
こんばんは。
Excel のオートメーションって色々難しいですよね。
当方に解る範囲でしたら回答させて頂きます。

>他に開いているファイルは、検索できましたが・・・。
>  For Each Myfile In Exl.Workbooks
>    If Myfile.Name = 「ファイル名」 Then
>      Myfile.Close savechanges:=False
>    End If
>  Next Myfile


Excel のインスタンスを生成した直後に

Exl.Visible = True

と記述して、
該当の Excelファイル を開いたままステップ実行を行って確認されてみて下さい。

>  For Each Myfile In Exl.Workbooks

は 2 個目に起動された Workbook を参照しているので
「ファイル名」で指定された Excel が検索ができないのだと思われます。


>もう一つは、下記です。
>よく分かりませんが、上手くいきませんでした。
>(使用中となりませんでした)
>  Exl.Workbooks.Open FileName:=「パス名+ファイル名」
>  Exl.Workbooks(「ファイル名」).Activate
>  If Exl.ActiveWorkbook.ReadOnly Then
>    MsgBox "使用中"
>    Exl.ActiveWorkbook.Close
>    Set Exl = Nothing
>    Exit Function
>  End If

こちらについてですがステップ実行をした際に

>  Exl.Workbooks(「ファイル名」).Activate

の行で1つ目の Excel ファイルが Active 状態になってしまっていないでしょうか?
(すみません、当方未検証です。)

Sub ExcelCheck()
'要参照 Microsoft Excel x.x Object Library
Dim xName As String
Dim xlsApp As New Excel.Application
Dim xlsWkb As Excel.Workbook

  xName = "c:\Test.xls
  xlsApp.Visible = True
 
  Set xlsWkb = xlsApp.Workbooks.Open(xName)
  Debug.Print xlsWkb.ReadOnly
  
  xlsWkb.Close: Set xlsWkb = Nothing
  xlsApp.Quit: Set xlsApp = Nothing 
End Sub

上記コードで、xName で指定されたファイルが開かれている場合、閉じている場合の
両方で検証されてみて下さい。

Set xlsWkb = xlsApp.Workbooks.Open(xName)

と定義しているので、xlsWkb は後から開かれた Excel を確実に指しております。

すみません、長くなりますのでレスを分けます。
・ツリー全体表示

【6752】Re:更新クエリで他のテーブルにある複数レ...
発言  かめ  - 05/11/6(日) 17:51 -

引用なし
パスワード
   すみません解決しました。
・ツリー全体表示

【6751】【解決】Re:エクセル出力
お礼  Mino  - 05/11/6(日) 11:41 -

引用なし
パスワード
   ▼小僧 さん:
▼YU-TANG さん:
ご回答、ありがとうございます。

結果としては、
AleadyOpenedの自作関数を使用する事で、
解決致しました。
YU-TANG さん、ありがとうございました。
又、小僧 さん、
色々なアドバイスをありがとうございます。
もしお分かりでしたら、教えて頂けないでしょうか?
説明の仕方が悪いかもしれませんが、ご了承下さい。


>指定の Excel ファイルを Open した後に
>Workbook の ReadOnly プロパティの値を調べる事で
>2重に開かれたかどうかを判断できると思います。

ロジックを見て頂くと分かりやすいかもしれません。
下記のようなロジックを追加してみました。

一つは、上書きを指定したファイルを検索して、
そのファイルは閉じるようにしてみました。
しかし「上書きしますか?」と上書きを指定したファイルだけは、
何故か検索されませんでした。
他に開いているファイルは、検索できましたが・・・。
  For Each Myfile In Exl.Workbooks
    If Myfile.Name = 「ファイル名」 Then
      Myfile.Close savechanges:=False
    End If
  Next Myfile

もう一つは、下記です。
よく分かりませんが、上手くいきませんでした。
(使用中となりませんでした)
  Exl.Workbooks.Open FileName:=「パス名+ファイル名」
  Exl.Workbooks(「ファイル名」).Activate
  If Exl.ActiveWorkbook.ReadOnly Then
    MsgBox "使用中"
    Exl.ActiveWorkbook.Close
    Set Exl = Nothing
    Exit Function
  End If

>>更には、次にエクセルを起動しようとすれば、起動できなくなっています。
>>(タスクマネージャーからEXCELを終了させれば、起動出来ましたが・・・)
>こちらについては原因が 2 点考えられます。
>1) 上位オブジェクトからの参照ができていない。
>2) オブジェクトの解放がうまくいっていない。
この場合は、エラーとなってしまうので、2) でしょうか。

分かっていないのですが、
コモンダイヤログを使用しており、
  ret = GetSaveFileName(OFN)
で、パス名+ファイル名を取得するようです。
ここでファイル保存先を指定する画面が開くのですが、
既存のファイルを指定すると、
「上書きしますか?」とメッセージが出ます。
「はい」にした時点で、
既存のファイル(既に開いているファイル)は、
どのような状態になるのでしょうか。
別でExcelが起動する気配はないのですが、
For Each に引っかからなかったので・・・。
(分かりにくい説明かもしれません。)

>CSV ファイルの出力であれば通常TransferText メソッドで行いますし、
>わざわざ Excel で開く必要もないと思われますが…。
申し訳ございません。
説明不足でした。
CSV は TransferText を使用しております。
・ツリー全体表示

【6750】更新クエリで他のテーブルにある複数レコ...
質問  かめ  - 05/11/6(日) 8:40 -

引用なし
パスワード
   テーブルtとテーブルttがありテーブルttにあるデータをテーブルtで更新させたいのですがどのようにしたらよいのでしょうか。

t  (商品)      (在庫)    tt (商品)  
   いちご       なし        いちご
   みかん       なし        りんご
   りんご       なし        ばなな
   パイナップル    なし
   バナナ       なし

たとえば上記のようなテーブルでttにある商品をtで在庫を"あり"と一度に更新したいような場合ですが更新させる項目が複数なので更新クエリの条件でつまずいてしまいます。
初心者なので申し訳ありませんがよろしくお願いします。
   

  
・ツリー全体表示

【6749】Re:エクセル出力
回答  YU-TANG WEB  - 05/11/5(土) 21:31 -

引用なし
パスワード
   こんにちは、YU-TANG です。

私の場合は、AleadyOpened という自作関数を使っています。
ご参考まで。

http://www.f3.dion.ne.jp/~element/msaccess/AcResTipsWarehouse1.html#TemplateExcelAuto
・ツリー全体表示

【6748】Re:SeekとArray
発言  小僧  - 05/11/5(土) 18:27 -

引用なし
パスワード
   ▼山田 さん:
こんばんは。

コードの 1部だけをご提示されても、何とも言えませんが
(全部提示されれば回答できるとも言えませんが)


>If rsTB.EOF Then

で False の値しか返していないという事ではないのでしょうか。
・ツリー全体表示

【6747】Re:エクセル出力
発言  小僧  - 05/11/5(土) 18:00 -

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

>又、既に開いているファイルを検索して、
>(上書きの)指定したファイルと同じファイル名が存在していれば、
>処理を行わないようなロジックを組みましたが、
>上手くいきませんでした。

こちらの具体的な方法が記述されておりませんが、
指定の Excel ファイルを Open した後に
Workbook の ReadOnly プロパティの値を調べる事で
2重に開かれたかどうかを判断できると思います。


>更には、次にエクセルを起動しようとすれば、起動できなくなっています。
>(タスクマネージャーからEXCELを終了させれば、起動出来ましたが・・・)

こちらについては原因が 2 点考えられます。

1) 上位オブジェクトからの参照ができていない。
2) オブジェクトの解放がうまくいっていない。

コードがご提示されておりませんので、どこに原因があるかは不明ですが
大抵上記 2 点のどちらかができていない為の事象であると思われます。


>今、あるフォームにエクセル、CSV出力ボタンを設け、
>画面のデータをエクセルへ出力するようにしています。

CSV ファイルの出力であれば通常TransferText メソッドで行いますし、
わざわざ Excel で開く必要もないと思われますが…。
・ツリー全体表示

【6746】SeekとArray
質問  山田  - 05/11/5(土) 16:39 -

引用なし
パスワード
   以下のようなコードを書いてみました。
特にエラーは出ないのですが
rsTBにデータがAddNewされません。
どなたか分かる方教えて下さい。

rsWB.MoveFirst

Do Until rsTB.EOF

rsTB.MoveFirst
rsTB.Seek Array(rsWB![期], rsWB![出張所CD], rsWB![費目CD], rsWB![営現CD]), adSeekFirstEQ

If rsTB.EOF Then
   rsTB.AddNew
   rsTB![期] = rsWB![期]
   rsTB![出張所CD] = rsWB![出張所CD]
   rsTB![費目CD] = rsWB![費目CD]
   rsTB![営現CD] = rsWB![営現CD]
   rsTB.Update
End If
   rsWB.MoveNext
Loop
・ツリー全体表示

【6745】エクセル出力
質問  Mino  - 05/11/5(土) 15:13 -

引用なし
パスワード
   初心者です。

今、あるフォームにエクセル、CSV出力ボタンを設け、
画面のデータをエクセルへ出力するようにしています。

エクセルへ出力する内容は、
クエリーで抽出した内容そのままです。

保存先を指定する「ダイアログ」を表示させて、
ファイル名を入力し、保存ボタンを押して、保存します。
又、既存のファイルに対しても、
「上書きしますか?」とメッセージが表示され、
上書き保存が可能です。
ここまでは正常に内容を出力できました。

問題は「既存のファイル」に対して、
上書きを行う時に、
そのファイルが開いている(オープン中の)場合です。
その場合、エラーが発生してしまいます。

エラー箇所は、
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, 「クエリー名」, 「保管先+ファイル名」, True
で、
エラー番号:3010
エラー内容:テーブル「クエリー名」は既に存在しています。
です。

何か、良い回避方法がありますか?
  On Error GoTo
で、強制的に?回避をしようやってみましたが、
開いているエクセルに対して、更新がかかったのか、
内容がクリアされてしまいます。
更には、次にエクセルを起動しようとすれば、起動できなくなっています。
(タスクマネージャーからEXCELを終了させれば、起動出来ましたが・・・)

又、既に開いているファイルを検索して、
(上書きの)指定したファイルと同じファイル名が存在していれば、
処理を行わないようなロジックを組みましたが、
上手くいきませんでした。

どんな方法でも結構ですので、
どなたか、宜しくお願い致します。
・ツリー全体表示

【6744】Re:テキストボックスの値を確認したいので...
お礼  中直 E-MAIL  - 05/11/5(土) 14:42 -

引用なし
パスワード
   ▼Gin_II さん:
ありがとうございました。
MsgBoxでテキストの内容確認が出来ました。

MsgBoxは、固定の文字列のみの表示だと
思い込んでいました。


>>VBAの中でテキストボックスの値を簡単なボックス
>>で表示して内容を確認したいのですが。
>
>MsgBox を使う
>Debug.Print でイミディエイトウィンドウを使う
>
>なんかでどうぞ。
・ツリー全体表示

【6743】Re:テキストボックスの値を確認したいので...
回答  Gin_II  - 05/11/5(土) 14:17 -

引用なし
パスワード
   >VBAの中でテキストボックスの値を簡単なボックス
>で表示して内容を確認したいのですが。

MsgBox を使う
Debug.Print でイミディエイトウィンドウを使う

なんかでどうぞ。
・ツリー全体表示

【6742】テキストボックスの値を確認したいのですが
質問  中直 E-MAIL  - 05/11/5(土) 13:40 -

引用なし
パスワード
   お世話になります。
ACCESSの入力画面をテストしていますが
イベントプロシジャのVBAでの処理がうまく
行っていないようです。
VBAの中でテキストボックスの値を簡単なボックス
で表示して内容を確認したいのですが。

よろしくお願いします。
・ツリー全体表示

【6740】Re:レコード件数の取得について
お礼  NK  - 05/11/5(土) 0:43 -

引用なし
パスワード
   ▼小僧 さん:
>▼NK さん:
>おはようございます。
>
>>『今開いているレコードのNo』を返す場合と
>>『開いているテ−ブルのレコード総数』を返す場合があります。
>
>Help で、RecordCount プロパティ を確認されてみて下さい。
>
>
>機械翻訳のためちょっと読みづらいのですが、MS の技術情報にも載っています。
>
>http://support.microsoft.com/default.aspx?scid=kb;ja;207652

返信が遅れてしまい申し訳ありません。
ありがとうございました。
参考にさせていただきます。
・ツリー全体表示

【6739】Re:【至急】テーブルリンクについて
質問  たん  - 05/11/4(金) 21:51 -

引用なし
パスワード
   tomono さん

oracle と access のバージョンは何ですか?
・ツリー全体表示

【6738】【至急】テーブルリンクについて
質問  tomono  - 05/11/4(金) 16:24 -

引用なし
パスワード
   Access初心者です。どうしてもわからなくて困っています。

oracleとテーブルリンクする際、データ項目が300個以上あり入りきりませ
んでした。使用したいのはそのうちの10項目くらいなので、指定した項目だけリンクさせたいのです。その方法がどうしてもわかりません。

どなたか教えてください。宜しくお願い致します。
・ツリー全体表示

【6737】Re:クエリで質問があります
回答  YU-TANG WEB  - 05/11/4(金) 12:16 -

引用なし
パスワード
   こんにちは、YU-TANG です。

> 御送り頂きました通り行いましたら電化製品の寿命が
> 表示されました。

ということは、「リストが一つも挙がって」こないという問題は
解決されたのでしょうか。
それは「([電化製品].[電化製品の寿命])=...」が原因だったので
しょうか。それとも、他の原因だったのでしょうか。

ここは公開掲示板なので、ROM の方々や過去ログ用にフィードバック
をお願いします。

> 1.故障日と再出荷日が空白の場合→現在から出荷日をひく
> 2.故障日のみが空白の場合→現在から再出荷日をひく
> 3.再出荷日のみ空白(故障日有り)→故障日から出荷日をひく

話が変わってきていますね。
条件判断が 2 フィールドではなく 3 フィールドに依存するとなると、
ここまでの話はご破算です。

私はこういうのを「後出しジャンケン」と呼んでいますが、後から
「実は…」と前提を変えられることによって、それまでのやりとりが
水泡に帰します。

あなたにとっても私にとっても時間の無駄ですから、説明は端折らず
正確にお願いします。


まず前提を仕切り直しましょう。
3 フィールドの組み合わせだと 2^3 で 8 通りの組み合わせが
有り得ますが、3 通りしか提示されていません。
この 3 通りしか有り得ないのでしょうか?

とりあえず仕様を明確にしてください。
でないと、また後で「実は出荷日のみが空白の場合はこうしたいんです
が…」と、無駄にスレが伸びるリスクを懸念しなければなりません。

また、この前提だとクエリ上の式のみで組むのは危険です。
不可能ではありませんが、おそらく式が複雑になって、初心者では
メンテナンス不能になります。
私がやるならユーザー定義関数を使いますが、VBA の使用は問題あり
ませんか?

# と言っても、元々こちらは「VBA質問箱」ですが。
              ~~~
> また、寿命の表示が現在、日数で表示されているのですが
> ○○年○○ヶ月○○日としたいのですが

こちらも先のケースと同じ理由で、VBA の方が適切に思います。
Microsoft 社が類似のサポート技術情報をリリースしていますが、
そちらでもユーザー定義関数を使っています。

http://support.microsoft.com/kb/100136/JA/
http://support.microsoft.com/kb/210522/JA/

上記の応用で実現できるでしょう。
・ツリー全体表示

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