Access VBA質問箱 IV

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

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


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

【10989】Re:複数バージョンが共存する中で特定の...
回答  YU-TANG  - 09/2/5(木) 22:39 -

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

> 本日2000/2007の双方のバージョンのエクセルを開けている状態で再度試したらダメでした・・・。

やはりそうでしたか。

> (ちなみに、Workbooks.の前にはxlappをつけて実行していました。スミマセン。)

了解です。
できれば実際のコードのまま転記していただけるとありがたいです。

> もう一度YU-TANG さんと小僧さんにご回答いただいた内容を含めていろいろ試してみます!

ご苦労様です。

ちょっと自分の説明が伝わりにくかったようなので、改めて説明して
みますが。

もともと 10959 でこう書きました。

> 先に新規ブックをどっかに作ってしまって、そいつを Shell で Excel 2000 に
> 開かせたら、GetObject で Excel 2000 のインスタンスを取れませんかね。

箇条書きにすると、こういう意味です。

1. 先に新規ブックをどこかに作っておく
2. 1 のファイルを Shell で Excel 2000 に開かせる
3. GetObject で 2 のインスタンスを取得する(混在環境がないので実際に取れるかどうかは知らない)

この通りのコードはまだ書かれていないようなので、あるいはコードを
書いて提示しないと伝わらないのかもしれません。

こんな感じです(ベタ打ちです)。

' 1. 先に新規ブックをどこかに作っておく
sFile = "K:\外貨入出金比較\BANK BOOK 照合\Book1.xls"

' 2. 1 のファイルを Shell で Excel 2000 に開かせる
sExcel2kExe = "C:\Program Files\Microsoft Office\Office\Excel.Exe"
Shell """" & sExcel2kExe & """ """ & sFile & """", vbNormalFocus
DoEvents  ' 念のため

' 3. GetObject で 2 のインスタンスを取得する
Set xlBook = GetObject(sFile)
Set xlApp = xlBook.Application
MsgBox xlApp.Version  ' 9.0 だったら Excel 2000

注意点としては、2 で Excel 2000 を起動しても ROT に登録される
前に 3 に進んでしまうと、GetObject が既存のインスタンスを取得
せずに Excel 2007 で新たに開きに行く可能性があります。その場合
は 2 と 3 のあいだでちょっと時間稼ぎする必要があるかもしれ
ません(10979 と混同しないようにしてください。こちらは同期待ち
したらダメですので)。

上の説明で伝わりますか?
それでは。
・ツリー全体表示

【10988】Re:クエリーの結果にかかわらず表示したい
発言  ケルビン  - 09/2/5(木) 14:22 -

引用なし
パスワード
   ▼カダワン さん:
フォームを開く前に、Dcount等で件数を確認し、
データが無い場合はフォームを開かない、
または、ダミーのテーブルを用意し
それをレコードソースとして開くようにする。

こんな方法でいかがでしょう。
・ツリー全体表示

【10987】Re:複数バージョンが共存する中で特定の...
お礼  yuki  - 09/2/5(木) 10:16 -

引用なし
パスワード
   ▼YU-TANG さん:
おはようございます!
本日2000/2007の双方のバージョンのエクセルを開けている状態で再度試したらダメでした・・・。
昨日できたのは、何か特定の条件で行ったからでしょうか。。
(ちなみに、Workbooks.の前にはxlappをつけて実行していました。スミマセン。)
もう一度YU-TANG さんと小僧さんにご回答いただいた内容を含めていろいろ試してみます!
またご報告します!


>こんばんは、YU-TANG です。
>
>> 下記の通り記載を直しました!
>>
>>   ChDir "K:\外貨入出金比較\BANK BOOK 照合"
>>   Workbooks.Open Filename:="K:\外貨入出金比較\BANK BOOK 照合\Book1.xls"
>>   Set xlApp = GetObject(, "Excel.Application.9")
>>
>> あらかじめファイルをver2000で作成しておきオープンというYU-TANG さんのご指摘方法で出来ました☆
>> ありがとうございました!!!!!
>
>解決したようで何よりです。
>
>……が、一応 過去ログのために補足しておくと、そのやり方は
>自分の回答と関係ないですし、そのコードでバージョンを特定
>できるというのも不思議です。
>解決しているわけですからそれでいいのかもしれませんが、
>小僧さんの提案で Excel 2000 を regserver したから
>クラス名 Excel.Application が Excel 2000 に関連付けられて
>いるだけの可能性はありませんか(まあそれで問題ないなら、
>はなから Excel 2000 を既定のクラス ハンドラーにしておけば
>よかっただけの話ですが)。
>また、Access VBA のはずなのに、何の修飾も無く「Workbooks」が
>出現するのも非常に香ばしい感じです。幽霊にとりつかれなければ
>よいのですが。
>
>2007 に関連付けられている混在環境の方は、10974 のコードで
>本当に特定バージョンの Excel を開けるのでしょうか?
>時間と環境が許す方は、再現テスト結果などお寄せいただけると
>有効性が確認できると思います。
>
>それでは。
・ツリー全体表示

【10986】Re:複数バージョンが共存する中で特定の...
発言  YU-TANG  - 09/2/4(水) 23:25 -

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

> 下記の通り記載を直しました!
>
>   ChDir "K:\外貨入出金比較\BANK BOOK 照合"
>   Workbooks.Open Filename:="K:\外貨入出金比較\BANK BOOK 照合\Book1.xls"
>   Set xlApp = GetObject(, "Excel.Application.9")
>
> あらかじめファイルをver2000で作成しておきオープンというYU-TANG さんのご指摘方法で出来ました☆
> ありがとうございました!!!!!

解決したようで何よりです。

……が、一応 過去ログのために補足しておくと、そのやり方は
自分の回答と関係ないですし、そのコードでバージョンを特定
できるというのも不思議です。
解決しているわけですからそれでいいのかもしれませんが、
小僧さんの提案で Excel 2000 を regserver したから
クラス名 Excel.Application が Excel 2000 に関連付けられて
いるだけの可能性はありませんか(まあそれで問題ないなら、
はなから Excel 2000 を既定のクラス ハンドラーにしておけば
よかっただけの話ですが)。
また、Access VBA のはずなのに、何の修飾も無く「Workbooks」が
出現するのも非常に香ばしい感じです。幽霊にとりつかれなければ
よいのですが。

2007 に関連付けられている混在環境の方は、10974 のコードで
本当に特定バージョンの Excel を開けるのでしょうか?
時間と環境が許す方は、再現テスト結果などお寄せいただけると
有効性が確認できると思います。

それでは。
・ツリー全体表示

【10985】クエリーの結果にかかわらず表示したい
質問  カダワン  - 09/2/4(水) 16:18 -

引用なし
パスワード
   いつもお世話になります。
また宜しくお願いいたします。

集計クエリをレコードソースにもつフォームがあるのですが、
条件に見合ったデータが無い場合、クエリの結果も当然無く
フォームの表示も何も無い状態になってしまうところを、
null値(0でも)で表示させる方法は何かあるでしょうか?

集計クエリではない場合は、条件に見合ったデータが無くても
クエリ結果に空のレコードが一行出来るので、フォームも表示
され、null値を取得してクエリ結果が該当が無い事が分かるのですが、
フォームに何も表示されないと、参照しに行った際エラーが
返ってきてしまいます。
on error を使って回避しようとしましたが、別の部分で既に
使用しているため、その処理も出来ません。
何か良い方法は無いでしょうか?
ちなみに、条件に合致するレコードの、ある数値フィールドの最大数
を求めるクエリーを表示させようとしています。

素人説明で分かり辛いかもしれませんが、どうぞ宜しくお願いします。
・ツリー全体表示

【10984】Re:Accessレポート
質問  ひろのしま E-MAIL  - 09/2/4(水) 11:36 -

引用なし
パスワード
   >Call Docmd.OpenReport("レポート名","")
これはただ単にレポートを開くコマンドということで
細かく記述したものではありません。で、原因はとりあえずここではありません。


相性ですかぁ・・・。OSとの相性かあるいは
PCに原因ですかぁ・・・。
しかもたまに起きる現象なので
もしかすればPCに原因があるのかもしれませんね。
了解です。
MSNで多少検索してみます。


▼あさのうみ さん:
>▼ひろのしま さん:
>私は
>XP Professional
>Acc2000 (OFFICE梱版ではなく単体版)
>ですが、そのような現象は起きた事がありません。
>
>OSよりも他のソフトとの相性(?)またはPC自体に
>原因があるかもしれません。
>(あるいはAccess自体が破損しているかも!?)
>Accessであれば、再インストールすれば良いですが、
>他の場合は・・・・T-T
>
>
>ちょっとだけ気になったのは
>> Call Docmd.OpenReport("レポート名","")
>OpenReportの第二引数は、viewだったかと思いますが、
>きちんと指定してあげてはいかがでしょう。
>
>これが原因とも思えませんが、
>天下のMS(!?)ですし、私もこのような記述はしていないので、
>あるいは・・・・・
・ツリー全体表示

【10983】Re:Accessレポート
発言  あさのうみ  - 09/2/4(水) 10:44 -

引用なし
パスワード
   ▼ひろのしま さん:
私は
XP Professional
Acc2000 (OFFICE梱版ではなく単体版)
ですが、そのような現象は起きた事がありません。

OSよりも他のソフトとの相性(?)またはPC自体に
原因があるかもしれません。
(あるいはAccess自体が破損しているかも!?)
Accessであれば、再インストールすれば良いですが、
他の場合は・・・・T-T


ちょっとだけ気になったのは
> Call Docmd.OpenReport("レポート名","")
OpenReportの第二引数は、viewだったかと思いますが、
きちんと指定してあげてはいかがでしょう。

これが原因とも思えませんが、
天下のMS(!?)ですし、私もこのような記述はしていないので、
あるいは・・・・・
・ツリー全体表示

【10982】Re:複数バージョンが共存する中で特定の...
お礼  yuki  - 09/2/4(水) 10:10 -

引用なし
パスワード
   ▼YU-TANG さん:

説明が足りずにすみません!
excel2000/2007共存の環境でaccess vbaにてexcel version2000を開き作業をしたいというのがやりたい事です。
CreateObjectとGetObjectを誤って記載してしまっていました!
下記の通り記載を直しました!

  ChDir "K:\外貨入出金比較\BANK BOOK 照合"
  Workbooks.Open Filename:="K:\外貨入出金比較\BANK BOOK 照合\Book1.xls"
  Set xlApp = GetObject(, "Excel.Application.9")

あらかじめファイルをver2000で作成しておきオープンというYU-TANG さんのご指摘方法で出来ました☆
ありがとうございました!!!!!


>こんばんは、YU-TANG です。
>
>>   Set xlApp = CreateObject("Excel.Application.9")
>(中略)
>> に変更してみたのですが、VERSION2000で保存していたBook1が2007で開いてしまいました(;_;)
>
>すみません、自分の回答とは無関係の内容のようですが、
>どういう意図のレスでしょうか。
>GetObject は使いたくないという意味でしょうか…?
・ツリー全体表示

【10981】Accessレポート
質問  ひろのしま E-MAIL  - 09/2/4(水) 9:35 -

引用なし
パスワード
   質問いたします。

OS:Windows XP Professional
Office:Office 2000 Professional
でAccessのレポートの機能を使用しています。
Call Docmd.OpenReport("レポート名","")
で、印刷ビューが手前に表示されないことがあります。
OSがWindows 2000 では起きないのですが、
Windows XP Professionalに限り起きているようです。
何か原因があるのでしょうか。

内容がご理解いただけるかどうか分かりませんが、
ご返信よろしくお願いします。
・ツリー全体表示

【10980】Re:複数バージョンが共存する中で特定の...
質問  YU-TANG  - 09/2/3(火) 22:37 -

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

>   Set xlApp = CreateObject("Excel.Application.9")
(中略)
> に変更してみたのですが、VERSION2000で保存していたBook1が2007で開いてしまいました(;_;)

すみません、自分の回答とは無関係の内容のようですが、
どういう意図のレスでしょうか。
GetObject は使いたくないという意味でしょうか…?
・ツリー全体表示

【10979】Re:複数バージョンが共存する中で特定の...
回答  小僧  - 09/2/3(火) 21:14 -

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

>>"C:\Program Files\Microsoft Office\Office\Excel.Exe" / regserver
>↑はコマンドプロンプト(DOSシェル?)へ打ち込むコマンドです。
>いくらなんでも、こんな事は起動の度には普通しないと思います。

について

>> 複数のバージョンの Office がインストールされている場合の
>> Office オートメーションについて
>>
>> h tp://support.microsoft.com/kb/292491/ja
> このスイッチは、テストや開発の目的には使用できますが、
> 運用時の手段として使用することはお勧めできません。

と「勧められない」と但し書きつきながら
MSで公式にアナウンスされています。

Excel2000 と Excel2007 が混在環境で存在していて、
どうしても先にインストールした Excel2000 を
OLEで呼び出したいのであれば
方法のひとつだと思われますがいかがでしょうか?


> 実行してみると「型が一致しません。」とのエラーが表示されます。
> VBAの記載方法が違いますか・・?(;_;)


neptune さんのご回答にもありましたが、
コマンドプロンプトにそのまま打ち込む様な感じになるため、


strPath = """C:\Program Files\Microsoft Office\Office\Excel.Exe"" /regserver"
Shell strPath, 1

のように、ダブルクォーテーションをさらに囲ってあげる必要がありますね。


当方の環境(Excel2003のみ)で行うと
レジストリへの登録に多少時間がかかります。

Shellメソッドが非同期のため次の行のコードが実行されるので
こちらについても対策が必要になってきますね。
(「Shell」「同期」などでWeb検索すれば出てくるかと思われます。)

ただ、当方としても

・VBA のコードとして可能である(と思う)

という為に提示させて頂いているだけであり、
実運用にそのまま使えるかどうかはまた別の話かと思います。
・ツリー全体表示

【10978】Re:テーブルの更新?方法
発言  小僧  - 09/2/3(火) 20:36 -

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

>これは、コードで対応できるものなのでしょうか
>それともトランザクションを組み込めば対応できるのでしょうか

そうですね。
クエリをダブルクリックしたり、
VBAのコードでいえば OpenQueryメソッドを使ったりした場合には
トランザクションの概念がありません。

前回のご質問にあったように
人がいない時に定時で実行させようとした際にエラーが発生した場合
ちゃんとロールバックしているのか、
途中まで作業がすすんでしまっているのか等の
ログが吐き出される訳ではない為、不安が残ってしまいます。

DAO や ADO の Execute メソッドを利用して
SQLを実行する場合においては
トランザクションを設定する事ができるため、
一連の処理を「全て行う」か「全て中止する」事ができます。

今回は削除して追加する処理になるため、
片方しか行われないと問題が発生してしまいます。

もし、定時の作業で行うのであれば
きちんとトランザクションを用いた方が無難かと思った次第です。
・ツリー全体表示

【10977】Re:テーブルの更新?方法
お礼  ON  - 09/2/3(火) 17:36 -

引用なし
パスワード
   ▼小僧 さん:
遅くなりました ありがとうございます

>残念ながらAccessではできません。
>Access以外のデータベースでは
>「UPSERT」なんてキーワードでWeb検索すると
>それに近いような事柄が出てくるかと思われます。

そーなんですか
ありがとうございます 勉強になります


>仕様がちょっと解りづらいのですが、
ですね 申し訳ありませんでした

必ず、一方でしか作業することがないので
>add_TBLに ID が重複するような事がなければ良いのですが…。
は、大丈夫な気がしますが・・・
確かにまずいですね
この辺もう少し考えて対処したいと思います


>クエリをダブルクリックするのではなく
>モジュールからVBAにて実行させる様な方法をとれば、
>追加クエリが正常に終了しなかった場合には
>削除クエリも行わなかった事にする事も可能です。

>こちらについては「トランザクション」「Access」などを
>キーワード検索すると事例が載っているかと思われます。
 ・・・
>という方が、無駄なゴミを作らないですみそうですね。

勉強になります ありがとうございます


>また、削除クエリと追加クエリを行う間に
>他割り込み処理が入らない事に注意が必要かもしれません。
>(他ユーザの使用や突然のPCのシャットダウン、
>ACCESSのフリーズによる強制終了など)
これは、コードで対応できるものなのでしょうか
それともトランザクションを組み込めば対応できるのでしょうか

この辺理解がありません
簡単にコメント頂けるとうれしいです

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

【10976】Re:複数バージョンが共存する中で特定の...
発言  neptune  - 09/2/3(火) 17:00 -

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


>"C:\Program Files\Microsoft Office\Office\Excel.Exe" / regserver
↑はコマンドプロンプト(DOSシェル?)へ打ち込むコマンドです。
いくらなんでも、こんな事は起動の度には普通しないと思います。
直接レジストリのExcelの規定のバージョンを書き換える命令ですから。

と、言っても直接の解決方法を知っているわけではありませんけど。
・ツリー全体表示

【10975】Re:複数バージョンが共存する中で特定の...
お礼  yuki  - 09/2/3(火) 16:14 -

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

↓こういうことでしょうか。。
strPass = "C:\Program Files\Microsoft Office\Office\Excel.Exe" / regserver
  Shell strPass, 1
  Set xlApp = CreateObject("Excel.Application.9")
  xlApp.Workbooks.Add
  xlApp.Visible = True ' アプリケーションを表示する場合は、Visible プロパティに True を設定します。
  Set MyDB = CurrentDb

実行してみると「型が一致しません。」とのエラーが表示されます。
VBAの記載方法が違いますか・・?(;_;)

▼小僧 さん:
>▼yuki さん:
>こんにちは。
>
>複数のバージョンの Office がインストールされている場合の
>Office オートメーションについて
>
>h tp://support.microsoft.com/kb/292491/ja
>
>この辺に問題がありそうですね。
>
>またそのページのリンク先に
>
>
>>Office OLE オブジェクトを別のプログラムに挿入する
>>
>> 1台のコンピュータに複数のバージョンの Office をインストールした場合、
>> Office オブジェクトを別のプログラムに挿入する
>> (たとえば、Excel ワークシート オブジェクトを Word 文書に挿入する) と、
>> 最新のバージョンのプログラムが使用されます。
>
>なんて記述も見られます。
>
>あまり良いとは思いませんが、
>
>"C:\Program Files\Microsoft Office\Office\Excel.Exe" /regserver
>
>と Shellステートメント実行後に
>OLE処理を行うとうまくいくかもしれませんね。
>
>(Officeの混在環境がないため、当方未検証です。)
・ツリー全体表示

【10974】Re:複数バージョンが共存する中で特定の...
お礼  yuki  - 09/2/3(火) 16:11 -

引用なし
パスワード
   YU-TANGさん、ご教授くださいましてありがとうございます!

ChDir "K:\外貨入出金比較"
  Workbooks.Open Filename:="K:\外貨入出金比較\BANK BOOK 照合\Book1.xls", UpdateLinks:=0
  Set xlApp = CreateObject("Excel.Application.9")
  xlApp.Workbooks.Add
  xlApp.Visible = True ' アプリケーションを表示する場合は、Visible プロパティに True を設定します。
  Set MyDB = CurrentDb

に変更してみたのですが、VERSION2000で保存していたBook1が2007で開いてしまいました(;_;)


▼YU-TANG さん:
>小僧さんが上げるまでスレに気づかなかった YU-TANG です。
>
>> このようにVBAを実行すると、Shellで作成した新規のエクセルファイル(excel2000)ではなく、今開いてるexcel全て(excel2007を含む)のうち、一番最初に開いているexcelシートに書き込みがされてしまいます。
>> Shellで作成した新規のエクセルファイルに書き込みをするにはどのようにしたらよいのでしょうか。
>
>逆じゃダメですか?
>先に新規ブックをどっかに作ってしまって、そいつを Shell で Excel 2000 に
>開かせたら、GetObject で Excel 2000 のインスタンスを取れませんかね。
>混在環境ないので試していませんが。
>
>まあ ROT から取るのが正攻法なんでしょうけど、面倒っちいんでパス。
・ツリー全体表示

【10973】Re:テーブルの更新?方法
回答  小僧  - 09/2/2(月) 4:19 -

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

> Q2)削除、追加のアクションクエリを1つの
> SQLつで実行するようなことは出来ますか

残念ながらAccessではできません。
Access以外のデータベースでは
「UPSERT」なんてキーワードでWeb検索すると
それに近いような事柄が出てくるかと思われます。


仕様がちょっと解りづらいのですが、
新規レコードが加わり、さらに更新がかかった場合、
add_TBLに ID が重複するような事がなければ良いのですが…。


また、削除クエリと追加クエリを行う間に
他割り込み処理が入らない事に注意が必要かもしれません。
(他ユーザの使用や突然のPCのシャットダウン、
ACCESSのフリーズによる強制終了など)

クエリをダブルクリックするのではなく
モジュールからVBAにて実行させる様な方法をとれば、
追加クエリが正常に終了しなかった場合には
削除クエリも行わなかった事にする事も可能です。

こちらについては「トランザクション」「Access」などを
キーワード検索すると事例が載っているかと思われます。


また、こちらも蛇足になるのですが
レコードの削除・追加を頻繁に繰り返すと
MDBの容量が肥大化する事が多々あります。
(定期的に最適化をすれば問題はないのですが)

・IDがある場合のUPDATE処理
・IDがない場合のINSERT処理

という方が、無駄なゴミを作らないですみそうですね。
・ツリー全体表示

【10972】Re:日時を日のみにし、かつ、カウントす...
お礼  にしもり  - 09/2/1(日) 22:27 -

引用なし
パスワード
   ▼ON さん:

ありがとうございました。できました!
アクセスはいまだ苦手で、特にSQLビューがよくわかっていません。
必ず時間を作って勉強します。
今回は本当にありがとうございました。
・ツリー全体表示

【10971】Re:日時を日のみにし、かつ、カウントす...
発言  ON  - 09/1/31(土) 22:29 -

引用なし
パスワード
   補足です

日のみ表示 カウント
2009/01/05

あまりよく読んでいませんでした
SELECT Format([テーブル1]![日時],"d") AS 日

d では 5
となってしまいますので
yyyy/mm/dd
と修正してください

あと
日    カウント
5    1
となっているのは
テストデータ作成時、1レコード目が欠落したためで
不具合はないと思います
・ツリー全体表示

【10970】Re:テーブルの更新?方法
発言  ON  - 09/1/31(土) 22:23 -

引用なし
パスワード
   結果報告です

>1)削除クエリを実行し
を、F-MDB で実行してみましたが

指定されたテーブルから削除できませんでした。
となってしまいました

結合した他のテーブルのデータを元に削除するクエリ3
ht tp://www.nurs.or.jp/~ppoy/access/access/acQ011.html
で、希望の操作かないました

>Q2)削除、追加のアクションクエリを1つの
>SQLつで実行するようなことは出来ますか

>その他、アドバイスありましたらよろしくお願いいたします

こちらについて何かありましたらよろしくお願いいたします
・ツリー全体表示

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