Access VBA質問箱 IV

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

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


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

【4911】Re:テーブルの追加・変更・削除の許可/禁...
質問  木村義春  - 05/4/16(土) 9:42 -

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

hatenaさん、ありがとうございます。

>>フォームは単独レコード表示のみにしておりますが。。。汗

>テーブルではプログラムによる制御は無理です。
>フォームなら可能です。
>
>フォームの単独レコード表示はどのようにしているのですか。
>レコード移動したいのなら、単独レコード表示をやめればいいだけでは。

一般的なユーザは、個人の情報のみ編集となっているので、
フィルタをかけて、単独レコード表示しているんです。

>テーブルではプログラムによる制御は無理です。

こういう意見を聞いて良かったです。晴れてすっきりしました。
念のため、プログラムの制御でなくても、他の方法ってあるでしょうか?
プログラムではなく、Accessの機能で制御できる方法があるので
ありましたら、教えて頂けると幸いです。

もし、あったらその機能をプログラムで表現する設定することも可能でしょうか?
例)起動時の設定をプログラムで表現することも可能とか。
・ツリー全体表示

【4910】Re:テーブルの追加・変更・削除の許可/禁...
回答  hatena  - 05/4/16(土) 1:47 -

引用なし
パスワード
   >フォームは単独レコード表示のみにしておりますが。。。汗
>
>やはり、無理でしょうか?
>ボタンを押した時点で同時に、テーブルのレコード削除禁止を設定する
>プログラム記述はないでしょうか。やはり、無理なんですよね??
>
>可能か、無理かを知りたいです。

テーブルではプログラムによる制御は無理です。
フォームなら可能です。

フォームの単独レコード表示はどのようにしているのですか。
レコード移動したいのなら、単独レコード表示をやめればいいだけでは。
・ツリー全体表示

【4909】Re:テーブルの追加・変更・削除の許可/禁...
発言  木村義春  - 05/4/15(金) 21:05 -

引用なし
パスワード
   誰もレスがないってことは、不可能でしょうか。。汗
不可能なら、あきらめるしかないと思います。
・ツリー全体表示

【4908】Re:コンボボックスについて
発言  木村義春  - 05/4/15(金) 20:51 -

引用なし
パスワード
   ▼小僧 さん:
>おはようございます。
こんばんわ♪

ご多忙のところ、回答を頂きましてありがとうございます。
あなたは私にとって、神様の存在です。

下記を試したところうまくいきました。
ただ、下記の方法だと、選択しているだけで、編集しているかしてないか判断は
できないので、同じ所属番号を2つ置きました。(やむを得ず。。)

1つは下記の同じ内容。
もう1つの所属は番号を表示するって形です。

>→レコードソースをT_アドレスに
>
>所属コンボ:
>
>[書式タブ]
>列数: 2
>列幅: 0cm;@@cm (@@は任意の値を)
>
>[データタブ]
>コントロールソース: 所属コード
>値集合タイプ: テーブル/クエリ
>値集合ソース: SELECT T_所属.所属コード, T_所属.所属 FROM T_所属;
>
>というような連結フォームにしてみてはいかがでしょうか?
・ツリー全体表示

【4907】Re:2行目からインポートしたい
お礼  にしもり  - 05/4/15(金) 18:38 -

引用なし
パスワード
   ▼小僧 さん:
>2つの条件が重なると、単純に TransferSpreadsheet メソッドが
>使用できなくなってしまします。

レスありがとうございます。
また、お手数をおかけしました。
実はわたくしもTransferSpreadsheet メソッドをあきらめ、小僧さんのおっしゃる2番でやることにしておりました。
通常Accessにインポートすることを想定するなら1行のみフィールド名を入れますが、わたくしがAccessにインポートすることを考えない仕事相手が作ったExcelファイルに、2行にわたってフィールド名が入っていたのです。
3行目からと言ったのはそういう理由でした。
みなさん、仕事をするときは相手の身になって作りましょう。

グチを言ってすみません・・
・ツリー全体表示

【4906】Re:既存のExcelファイルにエクスポートす...
質問  clike E-MAIL  - 05/4/15(金) 17:39 -

引用なし
パスワード
   マクロのプロシージャから実行できるように
関数として、Functionに変えました。
マクロのプロシージャから実行すると、
「実行エラー'1004':
ブックのシートをすべて削除または非表示にすることはできません」
というエラー表示がでています。
xlsWkb.Sheets(MyDate).Delete==>色反転
・ツリー全体表示

【4905】Re:ACCESSからエクセルを操作する方...
回答  小僧  - 05/4/15(金) 17:21 -

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

Excelの標準モジュールに書かれたマクロ(VBAのコード)であれば、
以下のコードでAccess側から実行する事は可能です。

Function MacroRun()
Dim xlsApp As Object
Dim xlsWkb As Object
Dim OutFile As String
Dim MacroName As String
  OutFile = "C:\MacroTest.xls" '出力のエクセルファイル
  MacroName = "マクロ1"    '実行しているマクロの名前
  
  Set xlsApp = CreateObject("Excel.Application")
  Set xlsWkb = xlsApp.Workbooks.Open(OutFile)
  xlsApp.Run xlsApp.ActiveWorkbook.Name & "!" & MacroName
  xlsWkb.Close (True): Set xlsWkb = Nothing
  xlsApp.Quit: Set xlsApp = Nothing
End Function

↑のコードをAccessのマクロですと「プロシジャの実行」で呼び出せば、
Excelのマクロが実行されます。

※こちらの掲示板ではマルチポスト(複数の掲示板にまったく同じ話題を
投稿すること)容認されてますが、他の掲示板には禁止となっている所も
もちろんあります。気をつけましょう。
・ツリー全体表示

【4904】ACCESSからエクセルを操作する方法
質問  よしあき  - 05/4/15(金) 15:17 -

引用なし
パスワード
   宜しくお願いします。

(1)ACCESSのフォームをクリックして、抽出されたデータをエクセルに出力(マクロでやってます)
(2)抽出されたデータを、エクセル上で、セル幅や項目変更等を、手動にて行っています。


この、(2)の処理を、エクセルのマクロを用いて行いたいのですが、ACCESSからエクセルのマクロ操作は可能なのでしょうか?

恥ずかしながら、私、VBAを知らない者で、ご存知の方がいらっしゃいましたら、宜しくお願い致します。
・ツリー全体表示

【4903】Re:2行目からインポートしたい
発言  小僧  - 05/4/15(金) 14:58 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。なかなかレスがつかないようですので…。

>既存のテーブルに追加するようにインポートしたいのですが

>3行目からインポートする必要が出ました。
の2つの条件が重なると、単純に TransferSpreadsheet メソッドが
使用できなくなってしまします。そこで考えられる方法として

1.「手動で」あらかじめエクセルを取り込める形に加工してから
   TransferSpreadsheetにて取り込む。

2.一度TransferSpreadsheetでワークテーブルに全てを取り込んでから、
   必要な分だけを追加クエリにて既存のテーブルに書き込む。

3.Access側からExcelを操作しながら取り込む。

etc...

3は既存のテーブルのフィールド構成のチェックなど、複雑なコードが
必要になる可能性があるので、私であれば2番で行うと思います。
・ツリー全体表示

【4902】Re:既存のExcelファイルにエクスポートす...
回答  小僧  - 05/4/15(金) 14:09 -

引用なし
パスワード
   ▼clike さん:
お待たせ致しました。ご指摘の通り、一行なんか空白がありますね…。

まぁ DoCmd.TransferSpreadsheet を正しく使っていない結果でしょうか。
以下のように修正しました。コードがややこしくなってしまい申し訳ないです。

※要Excel,DAO参照設定

Sub xlsOut()
Dim FSO As Object
Dim RS As DAO.Recordset
Dim xlsApp As New Excel.Application
Dim xlsWkb As New Excel.Workbook
Dim xlsSht As New Excel.Worksheet
Dim MyTBL As String
Dim MyFile As Variant
Dim MyDate As String
Dim MySheet As Variant
Dim Cnt As Long
 
'出力するテーブル、出力先ファイルの指定
  MyDate = Format(Now(), "m月dd日")
  MyTBL = "tempTBL"
  MyFile = "c:\temp.xls"
  
'存在チェック
  Set FSO = CreateObject("Scripting.FileSystemObject")
    If Not (FSO.FileExists(MyFile)) Then
      DoCmd.TransferSpreadsheet acExport, _
      acSpreadsheetTypeExcel9, MyTBL, MyFile, True
   
'エクセルシートの名前を変更
      Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
      xlsWkb.Sheets(MyTBL).Name = MyDate
      xlsWkb.Save
      xlsWkb.Close: Set xlsWkb = Nothing
      xlsApp.Quit: Set xlsApp = Nothing
    Else

'同日のシートが見つかった場合は削除
      Set RS = CurrentDb.OpenRecordset(MyTBL, dbOpenDynaset)    
      Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
      For Each MySheet In xlsWkb.Sheets
        If MySheet.Name = MyDate Then
          xlsApp.DisplayAlerts = False
          xlsWkb.Sheets(MyDate).Delete
          xlsApp.DisplayAlerts = True
          Exit For
        End If
      Next

'出力先ファイルにシートを追加
      Cnt = xlsWkb.Sheets.Count
      xlsWkb.Sheets.Add after:=xlsApp.Worksheets(Cnt)
      Set xlsSht = xlsWkb.ActiveSheet
      xlsSht.Name = MyDate
      For Cnt = 1 To RS.Fields.Count
        xlsSht.Cells(1, Cnt).Value = RS.Fields(Cnt - 1).Name
      Next
      xlsSht.Range("A2").CopyFromRecordset RS
      xlsWkb.Save
      xlsWkb.Close: Set xlsSht = Nothing: Set xlsWkb = Nothing
      xlsApp.Quit: Set xlsApp = Nothing
      RS.Close
      Set RS = Nothing
    End If
End Sub

>またテーブルではなく、クエリの場合は、利用かのでしょうか?

よくこういったご質問をお見かけしますが、
「まずやってみる!」のはいかがでしょうか?
(テストができない環境でしたら申し訳ありません。)

やってみて不具合がでる、うまくいくけど何か不安、etc… でしたら
再度投稿して頂ければ出来る限り(私でなくてもどなたかがきっと)
お答えしますので、提示されたコードをコピーするだけでなく、
がんばってオリジナルにも挑戦して頂きたいなと思います。

ちなみにこのコードですと変数:MyTBL にクエリの名前を入れて頂ければ
Excelに出力可能です。
・ツリー全体表示

【4901】Re:既存のExcelファイルにエクスポートす...
質問  clike E-MAIL  - 05/4/15(金) 13:07 -

引用なし
パスワード
   大変ありがとうございます。
無事に通りました。
追加されたシートにフィールドとレコードの間にnull行が
入っています。なくす方法はあるのでしょうか?
またテーブルではなく、クエリの場合は、利用かのでしょうか?
・ツリー全体表示

【4900】Re:既存のExcelファイルにエクスポートす...
回答  小僧  - 05/4/15(金) 12:44 -

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

すみません。
※要Excelの参照設定 を書くのを忘れていました。

Excelの参照設定を確認してみてください。

以下のようにすると参照設定なしでもうまくいきます。

>Sub xlsOut()
>Dim FSO As Object
>'Dim xlsApp As New Excel.Application
→Dim xlsApp As Object

>'Dim xlsWkb As New Excel.Workbook
→Dim xlsWkb As Object

>Dim MyTBL As String
>Dim MyFile As Variant
>Dim MyDate As String
>Dim MySheet As Variant
>Dim Cnt As Long

→追記
   Set xlsApp = CreateObject("Excel.Application")

>'出力するテーブル、出力先ファイルの指定
>  MyDate = Format(Now(), "m月dd日")
>  MyTBL = "tempTBL"
>  MyFile = "c:\temp.xls"

以下略
・ツリー全体表示

【4899】Re:既存のExcelファイルにエクスポートす...
質問  clike E-MAIL  - 05/4/15(金) 11:26 -

引用なし
パスワード
   ご回答をいただき、ありがとうございます。
いくつかの質問がありますので、よろしくお願いします。
操作のどこかに間違いがあると思いますが、教えていただけませんか?

以下の環境で試しました。
c:\temp.xls→作成した
access2003にてtempTBL→作成した

「sub/ユーザーフォームの実行」を押したら、

コンバイルエラー:
ユーザ定義型は定義されていません。
というメッセージがでています。
Dim xlsApp As New Excel.Application 色反転になっている
・ツリー全体表示

【4898】Re:コンボボックスについて
回答  小僧  - 05/4/15(金) 11:17 -

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

>あと、そのクエリを元に、フォームを作りました。
>下記を参考に、所属と管理を選ぶとする。
>レコードソースは、q_Address です。

→レコードソースをT_アドレスに

所属コンボ:

[書式タブ]
列数: 2
列幅: 0cm;@@cm (@@は任意の値を)

[データタブ]
コントロールソース: 所属コード
値集合タイプ: テーブル/クエリ
値集合ソース: SELECT T_所属.所属コード, T_所属.所属 FROM T_所属;

というような連結フォームにしてみてはいかがでしょうか?
・ツリー全体表示

【4897】Re:コンボボックスについて
発言  木村義春  - 05/4/14(木) 20:01 -

引用なし
パスワード
   ▼小僧 さん:
こんばんわ。

T_アドレス
所属コード 管理コード 他のフィールド・・・
100    30
100    30
200    30
200    30
400    40

T_所属
所属コード 所属
100     A
200     B
300     C
400     D
500     E

T_管理
管理コード 管理
30     A
40     B
50     C
60     D
70     E

実は1つだけじゃなく2つありまして、教えて頂いたSQL文
(小僧さんの例は1つ)を参考に

SELECT T_アドレス.*, T_所属.所属, T_管理.管理
FROM (T_アドレス LEFT JOIN T_所属 ON T_アドレス.所属コード = T_所属.所属コード) LEFT JOIN T_管理 ON T_アドレス.管理コード = T_管理.管理コード;
を入れたらクエリが作成され、そのクエリで、

所属コードとか、管理コードの番号を変更してみたら、
T_所属で定義された所属が自動的に変更されていました。本当に有難う御座いました。

あと、そのクエリを元に、フォームを作りました。
下記を参考に、所属と管理を選ぶとする。
レコードソースは、q_Address です。

所属コンボ:
コントロールソース:所属
値ソース:SELECT T_所属.所属 FROM T_所属;

所属コード:可視をいいえにして隠す。(所属コンボで選択したら、自動的に変更されるようにしたい)
コントロールソース:所属コード

  Me.所属コード.Value = DLookup("所属コード", "T_所属", _
           "[所属] = '" & 所属コンボ.Value & "'")

としてみたところ、なぜか、前のフィールドを変更する前に、まずレコードを
保存してくださいとエラーが起きてしまいます。
そのエラーメッセージが何故、出てくるか疑問なので、ためしに、

  DoCmd.RunCommand acCmdSaveRecord
  Me.所属コード.Value = DLookup("所属コード", "T_所属", _
           "[所属] = '" & 所属コンボ.Value & "'")


としたら、大丈夫だけど、選択したら、番号は何も変更されないようです。

ちなみに、非連結にした場合は、選択したらテキストの番号は自動的に
変更されませんが、非連結であるため、何も表示されない状況で、何か選択しないといけないようです。

>所属コンボ:
>コントロールソース:所属
>値集合ソース   :SELECT T_所属.所属 FROM T_所属;

>番号テキスト:
>コントロールソース:番号

>として、

>Private Sub 所属コンボ_AfterUpdate()
>  Me.番号テキスト.Value = DLookup("番号", "T_所属", _
>              "[所属] = '" & 所属コンボ.Value & "'")
>End Sub

クマゴローさんのやり方も試したところ、
Me.所属コード.Value = Me.所属コンボ.colum(0).value
を入れてみたところ、「オブジェクトが必要です」とエラーが起きてしまいます。

お力を貸して頂けると幸いです。すいません。
・ツリー全体表示

【4896】Re:コンボボックスについて
発言  小僧  - 05/4/14(木) 10:50 -

引用なし
パスワード
   ▼木村義春 さん
おはようございます。

【4879】Re:コンボボックスについて において
>T_アドレスに[社員番号]フィールドを持たせずに、
>T_所属から連結した値を持ってくるクエリを
>作成してみてはいかがでしょうか?

と書きましたが、[所属]フィールドの間違いでした。すみません。

というのも、上記はテーブルの正規化を提案しております。

T_所属マスタ
所属コード 所属名
100     A
200     B
300     C
400     D
500     E

T_アドレス
ID 姓名    所属コード 会社名     住所
1 山田 太郎  100    XX有限会社  ・・・・
2 鈴木 次郎  200    ○○○○    ・・・・
3 佐藤 花子  300    ☆☆☆     ・・・・
4 田中 三郎  400    ××有限会社  ・・・・

会社名についても、例えば「XX有限会社」が「XX株式会社」となった場合には
「××有限会社」に所属する全員のレコードの変更が必要になるので
会社マスタを持たせたる必要が出てくるかもしれません。

こういった正規化をすすめた上でリレーションを組み、

SELECT T_アドレス.ID, T_アドレス.姓名, T_アドレス.所属コード,
      T_所属マスタ.所属名, T_アドレス.会社名, T_アドレス.住所
FROM T_アドレス INNER JOIN T_所属マスタ
      ON T_アドレス.所属コード = T_所属マスタ.所属コード;

とクエリを作成した方が良いのでは? というのが当方の提案です。
・ツリー全体表示

【4895】Re:コンボボックスについて
発言  木村義春  - 05/4/13(水) 22:14 -

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

>SELECT T_アドレス.ID, T_アドレス.姓名, T_所属.番号, T_アドレス.所属 , T_アドレス.会社名, T_アドレス.住所
>FROM T_アドレス INNER JOIN T_所属 ON T_アドレス.所属  = T_所属.所属;

T_アドレスはフィールド数が多いので、
T_アドレス.* としました。

気になったんですが、
上記をクエリのSQLビューに貼り付けてみました。
SELECT T_アドレス.* FROM T_アドレス INNER JOIN T_所属 ON T_アドレス.所属1 = T_所属.所属;

これを貼り付けた結果、クエリを編集してみると、
このレコードセットは更新できませんとメッセージ表示されてしまいます。

この方法だと、クエリの所属を変更したら、番号も自動的に入力される
ようになるでしょうか?
・ツリー全体表示

【4894】Re:コンボボックスについて
発言  木村義春  - 05/4/13(水) 21:05 -

引用なし
パスワード
   ほかにも案がありましたら、宜しくお願いします。
言葉だけではとらえにくいので、テーブル構成とかクエリ構成の図も
示していただけるとありがたいです。

例えば、T_アドレスの所属は削除して、番号のみにするとか。。
・ツリー全体表示

【4893】Re:テーブルの追加・変更・削除の許可/禁...
回答  木村義春  - 05/4/13(水) 21:03 -

引用なし
パスワード
   お忙しいところ、回答頂きまして誠に有難う御座います。

フォームは単独レコード表示のみにしておりますが。。。汗

やはり、無理でしょうか?
ボタンを押した時点で同時に、テーブルのレコード削除禁止を設定する
プログラム記述はないでしょうか。やはり、無理なんですよね??

可能か、無理かを知りたいです。
・ツリー全体表示

【4892】Re:テーブルの追加・変更・削除の許可/禁...
回答  小僧  - 05/4/13(水) 13:18 -

引用なし
パスワード
   ▼木村義春 さん:
>フォーム上だと、データの変更を行う時点でレコードロックがかかり、
>レコード移動できなくなってしまい、保存ボタン(レコード保存される)を押して
>からでないと、
>レコード移動できなくなります。

当方の環境ですと、データベースウィンドウで[フォーム]を選択し、

[新規作成]→[オートフォーム:表形式]

[基になるテーブルまたはクエリの選択]のドロップダウンリスト
T_アドレスを選択

で作成されるフォームで更新・移動ともにできるのですが…。
・ツリー全体表示

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