Access VBA質問箱 IV

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

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


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

【13007】Re:ファイル取り込み
発言  M・A・D  - 16/5/8(日) 22:51 -

引用なし
パスワード
   >このプログラムでは、元々あったテーブルをまず削除して、
>エクセルから取り込んだテータを同名のテーブルとして
>作成するという動作をしています。エラーさえ起きなければ、
>テーブル削除後に毎回新しいテーブルが作成されていたはずです。
 何か適当な同名のテーブルを作成後、今まで通り実行すると、正常なプログラムの流れに戻ってエラーがなくなるということでよろしいでしょうか?

ちなみに、ここでいうテーブル作成というのはプログラム自体に1行何か追加するということでしょうか


>参考までに、それぞれのプログラムの冒頭にある「On Error GoTo エラー」を
>削除すると、エラーが発生したところで、プログラムのどこで止まったのかが
>表示されるので、それがどこか確認してみてはどうでしょう。その状態で、
>イミディエイトウィンドウ(プログラムコード表示画面の下にあります。
>なければメニューの「表示」から選択してください)に「?strac」と入れて
>エンターキーを押すと、削除/作成しようとしているテーブル名が表示
>されるはずですので、それがどうなっているのか確認してみてください。
明日会社で試してみたいと思います
真ん中より少し上のほうに「On Error GoTo Error1」ってのもありますが、これも含めてすべて消すということでしょうか?


>なお、プログラムの元ネタと思われるサイトのURLは以下です。
>(投稿規制でうまく張れないので、httの後にpを入れてください)
>htt://www.accessclub.jp/samplefile/samplefile_127.htm
ありがとうございます。
・ツリー全体表示

【13006】Re:ファイル取り込み
回答  亀マスター  - 16/5/8(日) 5:47 -

引用なし
パスワード
   >テーブル作成が自動的に行われていたということでしょうか?
このプログラムでは、元々あったテーブルをまず削除して、
エクセルから取り込んだテータを同名のテーブルとして
作成するという動作をしています。エラーさえ起きなければ、
テーブル削除後に毎回新しいテーブルが作成されていたはずです。

>存在しないとされるテーブル名は『T_Sample&POP 』と『Sample&POP 』とそれぞれ違います。
これはちょっとわかりませんね…。
手元で完全に同じプログラムを実行したわけではないので正確には言えませんが、
プログラムのコードを見る限り、 T_ が付かない方は使われていないように見えますが。

参考までに、それぞれのプログラムの冒頭にある「On Error GoTo エラー」を
削除すると、エラーが発生したところで、プログラムのどこで止まったのかが
表示されるので、それがどこか確認してみてはどうでしょう。その状態で、
イミディエイトウィンドウ(プログラムコード表示画面の下にあります。
なければメニューの「表示」から選択してください)に「?strac」と入れて
エンターキーを押すと、削除/作成しようとしているテーブル名が表示
されるはずですので、それがどうなっているのか確認してみてください。

なお、プログラムの元ネタと思われるサイトのURLは以下です。
(投稿規制でうまく張れないので、httの後にpを入れてください)
htt://www.accessclub.jp/samplefile/samplefile_127.htm
・ツリー全体表示

【13005】Re:ファイル取り込み
発言  M・A・D  - 16/5/8(日) 2:36 -

引用なし
パスワード
   亀マスターさん回答ありがとうございます。
新たにテーブルを作成すれば解決するとのことですが、前述の通り、Accessは詳しくないのでわからないのですが、ファイル名変更前は当プログラムを使う前にテーブル作成を毎回行っていたわけではないのでどうして問題なく作動していたのでしょうか?
テーブル作成が自動的に行われていたということでしょうか?

また、プログラムを記載したレスにも書いたのですが、それぞれ違ったExcelファイルを取り込む2つのボタンあり、それをクリックするとExcelを取り込む仕様になっているのですが、現状、どちらのボタンを押してもエラー3011が表示されますが、存在しないとされるテーブル名は『T_Sample&POP 』と『Sample&POP 』とそれぞれ違います。
新しく作成するテーブルは『T_Sample&POP 』と『Sample&POP 』の2つを作成するということでしょうか


>予想するに、元々の制作者もあまりAccessやVBAに詳しくないのでしょう。
>エクセルデータを取り込むサンプルプログラムを丸ごとコピーして、
>取り込むファイルのファイル名だけ修正したのでしょう。
>(元ネタのプログラムはネットですぐに見つかりました)
はい、おそらくそうです。
ちなみにですが。参考までに元ネタのプログラムのURL等教えていただけないでしょうか?
・ツリー全体表示

【13004】Re:ファイル取り込み
回答  亀マスター  - 16/5/7(土) 21:11 -

引用なし
パスワード
   >  DoCmd.DeleteObject acTable, strac 'テーブルを削除します。
原因はおそらくここですね。
この手前の行で削除するテーブルの名前を指定していますが、
それが見つからないためにエラーとなるのでしょう。

とりあえずの解決手段としては、エクセルファイルの名前を
元に戻した上で、アクセスの方に T_Sample&POP という名前の
テーブルを作成するといいでしょう。テーブルは名前さえ
合っていれば中身はどうでもいいです。

なんで今まで大丈夫だったのにこうなったのかというと、
一度エクセルファイルの名前を変えてしまった際、プログラムの中で
エクセルファイルを取り込もうとしたところでエラーが起こったが、
その前にアクセスのテーブルが削除されており、その後、新しいテーブルが
作成されておらず、次回プログラム起動時にありもしないテーブルを
削除しようとしたためエラーになったということです。

ところでこのプログラム、作成者でないあなたに言っても
仕方のないことですが、システムとして使い物にならないレベルですね。

取り込み対象のエクセルファイルの名前はおろか、その保存場所まで
プログラムそのものに指定してあるため、エクセルファイルの場所を
動かしても今回と同じエラーが起こるでしょう。また、エラー処理が
甘いので、エクセルファイルが見つからなかったり、データ構造が
いじられたりしていると、後で元に戻しても、正常に動かなくなる恐れが
あります(今回はまさにこのパターンでしょう)。

予想するに、元々の制作者もあまりAccessやVBAに詳しくないのでしょう。
エクセルデータを取り込むサンプルプログラムを丸ごとコピーして、
取り込むファイルのファイル名だけ修正したのでしょう。
(元ネタのプログラムはネットですぐに見つかりました)

もしも今後、あなたが勉強してプログラムを修正されるのであれば、
取り込む対象のエクセルファイルをユーザーが指定出来るようにしたり、
テーブル削除をエクセルファイルの存在有無の確認後にするなど
することをお勧めします。
・ツリー全体表示

【13003】Re:ファイル取り込み
発言  M・A・D  - 16/5/7(土) 2:21 -

引用なし
パスワード
   Option Compare Database

Private Sub aJ取り込み_Click()
  On Error GoTo エラー

  Dim strac As String
  Dim strxls As String
  Dim strrange As String
  Dim strmsg As String
  Dim mySQL As String
  Dim strQry As String
    
  strac = "T_Sample&POP"
  strxls = "C:\Documents and Settings\CT207154\デスクトップ\取り込みデータ\●●●.xls" 'エクセルファイルを指定します。
  strrange = "Q_FRM014_EXCEL依頼書出力ヘッダ!" 'データ入力のシート名とセル範囲を指定します。
  strmsg = "aJデータを取り込みますか?" 'MsgBoxのメッセージです。
  mySQL = "DELETE * FROM T_データ格納"
  strQry = "Q_追加_取込aJデータ"


  If MsgBox(strmsg, vbOKCancel, "MS") = vbOK Then
  DoCmd.DeleteObject acTable, strac 'テーブルを削除します。
    '最初のデータをフィールド名として使います。
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _
                    strac, strxls, True, strrange
    
    DoCmd.RunSQL mySQL 'T_データ格納テーブルを削除します。
    DoCmd.OpenQuery strQry  'データ格納テーブルに取込データを追加します。
    Me.Requery
    Me.Refresh
    
    MsgBox "データ入力は、正常に完了しました。"

  End If

  Exit Sub

エラー:

  Select Case Err.Number

    Case 7874
      'エラーの原因となったステートメントの、
      '次のステートメントからプログラムの実行を再開します。
      Resume Next
    Case Else
      MsgBox "予期せぬエラーが発生しました。" & Chr(13) & Chr(13) & _
          "エラー番号:" & Err.Number & Chr(13) & Chr(13) & _
          "エラー内容:" & Err.Description, 1, "MS"
      End

    End Select
End Sub

Private Sub brand_Change()
Me.Requery
Me.Refresh
End Sub

Private Sub CHKALL_Click()
On Error GoTo Error1

Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = Me.RecordsetClone

Me.Requery
Me.Refresh
If Me.CHKALL = True Then
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs!チェック = True
rs.Update
rs.MoveNext
Loop
Else
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs!チェック = False
rs.Update
rs.MoveNext
Loop
End If
Me.Refresh
rs.Close
Exit Sub

Error1:
MsgBox "もう一度試してみてください。", , "Hitachi Trasport System, Ltd."
End Sub

Private Sub Close_Click()
DoCmd.Quit acQuitSaveAll
End Sub

Private Sub Form_Click()

End Sub


Private Sub import_Click()
  On Error GoTo エラー

  Dim strac As String
  Dim strxls As String
  Dim strrange As String
  Dim strmsg As String
  Dim mySQL As String
  Dim strQry As String
    
  strac = "T_Sample&POP"
  strxls = "C:\Documents and Settings\CT207154\デスクトップ\取り込みデータ\▲▲▲.xls" 'エクセルファイルを指定します。
  strrange = "Q_FRM014_EXCEL依頼書出力ヘッダ!" 'データ入力のシート名とセル範囲を指定します。
  strmsg = "ファイルをインポートします" 'MsgBoxのメッセージです。
  mySQL = "DELETE * FROM T_データ格納"
  strQry = "Q_追加_取込データ"


  If MsgBox(strmsg, vbOKCancel, "MS") = vbOK Then
DoCmd.DeleteObject acTable, strac 'テーブルを削除します。
    '最初のデータをフィールド名として使います。
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _
                    strac, strxls, True, strrange
    
    DoCmd.RunSQL mySQL 'T_データ格納テーブルを削除します。
    DoCmd.OpenQuery strQry  'データ格納テーブルに取込データを追加します。
    Me.Requery
    Me.Refresh
    
    MsgBox "データ入力は、正常に完了しました。"

  End If

  Exit Sub

エラー:

  Select Case Err.Number

    Case 7874
      'エラーの原因となったステートメントの、
      '次のステートメントからプログラムの実行を再開します。
      Resume Next
    Case Else
      MsgBox "予期せぬエラーが発生しました。" & Chr(13) & Chr(13) & _
          "エラー番号:" & Err.Number & Chr(13) & Chr(13) & _
          "エラー内容:" & Err.Description, 1, "MS"
      End

    End Select
End Sub

Private Sub コマンド49_Click()
Me.Requery
Me.Refresh

End Sub

Private Sub 出力_Click()
On Error GoTo エラー


FileName = "C:\Documents and Settings\CT207154\デスクトップ\送り状ファイル\Sample変換データ" & Forms!F_menu![brand] & "" & Format(Now(), "yyyymmdd") & ".csv"

If MsgBox("抽出するデータにチェックをつけたことを確認してください。変換データを出力しますか?", vbYesNo) = vbYes Then
Me.Requery
Me.Refresh

DoCmd.TransferText acExportDelim, , "Q_出力明細2", FileName

MsgBox "指定のフォルダに保存完了しました。"
Exit Sub
Else
MsgBox "データの出力を中止いたしました!"
End If

Exit Sub
エラー:

  Select Case Err.Number

    Case 7874
      'エラーの原因となったステートメントの、
      '次のステートメントからプログラムの実行を再開します。
      Resume Next
    Case Else
      MsgBox "予期せぬエラーが発生しました。" & Chr(13) & Chr(13) & _
          "エラー番号:" & Err.Number & Chr(13) & Chr(13) & _
          "エラー内容:" & Err.Description, 1, "Microsoft Access Club"
      End

    End Select
End Sub


_____________________________________

ちょっと貼り付けてみました。
大まかにプログラムを説明すると、Excelを取り込むボタンが2種類あってそれぞれ別のExcelを取り込みます。(●●●.xlsと▲▲▲.xls)←中身のデータの並びは一緒です)
エラー内容は前述のとおりで、T_Sample&POP(またはSample&POP)が見つかりませんと表示されます。
変更してしまったファイル名は、一方だけなのですが、どちらのボタンをクリックしてもエラーが表示されてしまいます。
ちなみに、変更してしまった時のファイル名ですが★★★+元のファイル名という形で変更してしまっております。(★★★を取り除いても同様のエラーが出ます)

また、ファイル名を変更してしまい最初にエラーがでたときに、Accessのメニューの外部データの取り込みのインポートやリンクを実行してしまったためにプログラムに余計な行が追加されてしまっているかもしれません。
・ツリー全体表示

【13002】Re:ファイル取り込み
回答  亀マスター  - 16/5/5(木) 23:08 -

引用なし
パスワード
   これだけの情報だとなんとも言えないのですが、
エラー3011は指定したファイルやテーブルが見つからないというものです。

ファイル名の変更によりプログラムの内容が変わるということは
考えられないので、ファイル名を戻したつもりで戻せてないか、
ファイルの保存場所を変更したのが原因ではないでしょうか。
ファイル名に記号や英数字が入っている場合、全角/半角が正しいか
確認してみては?または、エクセルファイルの構造を変更したり
していないでしょうか。
・ツリー全体表示

【13001】Re:フォームで職員番号の自動入力
回答  亀マスター  - 16/5/5(木) 21:35 -

引用なし
パスワード
   >抽出条件がデータ型と一致しません

答えはまさにこのメッセージかと思います。

T_職員一覧 のフィールドとしてある 職員名 がテキスト型なのに対し、
Me!職員名 がテキスト型として認識されていないのが問題です。
DlookupやSQLのWhere句(抽出条件)でテキスト型の値を扱う際は、
半角のシングルクォーテーションで囲む必要があります。

"職員名=" & Me!職員名

"職員名='" & Me!職員名 & "'"

のようにしてみてください。

参考までに、日付型であれば#で囲む必要があります。
・ツリー全体表示

【13000】Re:ファイル取り込み
発言  M・A・D  - 16/5/4(水) 20:16 -

引用なし
パスワード
   やっぱ実際のプログラム記載しないと回答は難しいですかね・・・
・ツリー全体表示

【12999】Re:フォームで職員番号の自動入力
質問  まさし  - 16/5/4(水) 15:22 -

引用なし
パスワード
   まさしです。

>Me.職員番号 = DLookup("職員番号", "T_職員一覧", "職員名=" & Me!職員名)

でやってみたところ、

抽出条件がデータ型と一致しません

とエラーが出てしまいました。
ウムム。

職員名は「T_職員一覧」で「短いテキスト型」
になっています。
データ型が一致しないとは何なのか。
いろいろ試し中です。

分かる方、いらっしゃいますか。
・ツリー全体表示

【12998】Re:フォームで職員番号の自動入力
お礼  まさし  - 16/5/4(水) 14:44 -

引用なし
パスワード
   亀マスターさん
返信ありがとうございます。

>そのコンボボックスの値自体を職員番号で上書き
>しようとしているように見えます

まだ初歩的なところでつまずいてます。


>予想される用途としては、他のテキストボックスなどに
>職員番号を表示させたいということでしょうから、

>Me.職員名
>を
>Me.テキストボックス名

>のように変更されてはどうでしょうか。
>(もちろん、テキストボックスはフォーム中に作っておく)

ありがとうございます。

Me.職員名 = DLookup("職員番号", "T_職員一覧", "職員名=" & Me!職員名)

Me.職員番号 = DLookup("職員番号", "T_職員一覧", "職員名=" & Me!職員名)
に変更するということでいいでしょうか。
・ツリー全体表示

【12997】Re:フォームで職員番号の自動入力
回答  亀マスター  - 16/5/3(火) 9:45 -

引用なし
パスワード
   職員番号はフォームのどこに入力されるようにしたいのでしょうか。
提示されたコードを見ると、「職員名」というコンボボックスを
更新すると、そのコンボボックスの値自体を職員番号で上書き
しようとしているように見えます。

予想される用途としては、他のテキストボックスなどに
職員番号を表示させたいということでしょうから、

Me.職員名

Me.テキストボックス名

のように変更されてはどうでしょうか。
(もちろん、テキストボックスはフォーム中に作っておく)
・ツリー全体表示

【12996】ファイル取り込み
質問  M・A・D  - 16/5/1(日) 15:22 -

引用なし
パスワード
   会社でExcelファイルを取り込むAccessのプログラムを使っているのですが、取り込み対象のファイルの名前を変更してしてしまい、実行時エラー3011が出るようになってしまいました。すぐさま元のファイル名に戻したのですがやはり実行時エラー3011が出るようになってしまいました。

Access自体は習ったりプログラミングの経験があるわけではないので、どこを直せばいいのかわかりません。取り込み対象のファイルのファイル名の変更によってプログラムの中身が改変されるというのはあるのでしょうか?
・ツリー全体表示

【12995】フォームで職員番号の自動入力
質問  まさし  - 16/4/30(土) 8:36 -

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

職員の有休管理のシステムを作っています。

フォームで名前を入力(選択)すれば、
自動的に職員番号も入力されるようにしたいです。
いろいろと試行錯誤しているのですが、上手くいきません。
どのようにすればいいでしょうか。


職員の情報はテーブル「T_職員一覧」にまとめています。
フォームのコンボリスト「職員名」の更新後処理に


Private Sub 職員名_AfterUpdate()

  Me.職員名 = DLookup("職員番号", "T_職員一覧", "職員名=" & Me!職員名)
  
End Sub

と入力しています。
・ツリー全体表示

【12994】Re:ハンドルの取得
お礼  たぬき E-MAIL  - 16/4/28(木) 20:01 -

引用なし
パスワード
   ▼かるびの さん:
コメントありがとうございます。

自分で調べてわかったことがあります。

VBのフォームのハンドルはMe.hWndで取れ、デバイスコンテキストはGetDCやMe.hDCで取れます。

ところがアクセスのフォームは複数のクラスが集まっています。
Me.Hwndでは取れません。

詳細部分のハンドルは、Me.Hwndから"OFormSub"の名前の子ウィンドウを探します。
次に"OFormSub"の子ウィンドウ"OFEDT"の値でした。
・ツリー全体表示

【12993】Re:ハンドルの取得
回答  かるびの  - 16/4/26(火) 10:25 -

引用なし
パスワード
    Renctangle 関数は、Window API 関数ですね。

 私はVBAしか使えず、Window API 関数に詳しいわけではありませんが、
Window API 関数を使ったことはあります。
 なので、わかる範囲での回答となります。


 Renctangle 関数の第1引数には「デバイスコンテキストのハンドル」を指定します。
 Me.Hwnd で取得できるのは、ウィンドウ・ハンドルであり、デバイスコンテキストハンドルではありません。
 デバイスコンテキストハンドルは、GetDC 関数で取得します。

 
 VBAではなく、VBについてのページですが、

ht tp://homepage1.nifty.com/rucio/main/tyukyu/tyukyu5.htm

が参考になるかもしれません。
・ツリー全体表示

【12992】ハンドルの取得
質問  たぬき E-MAIL  - 16/4/26(火) 6:38 -

引用なし
パスワード
   はじめまして。

アクセス2010のフォームの「詳細部」に独自のグラフを描かせたいと
思っています。(Rectangle等を使って)


その場合ハンドルが必要ですがわかりません。

Me.Hwndもクラス名"OMain"は何か違うようです。

ハンドル0だと描きますが、全体に対してみたいです。

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

【12991】Re:1日を8時間に
お礼  まさし  - 16/4/17(日) 23:18 -

引用なし
パスワード
   かるびのさん
教えてくださってありがとうございます。
Accessを使いだした初心者ですのでとても助かりました。


>「有給休暇」フィールドの合計を8で割る

なるほどとおもいました。


クエリで

取得後日数: Int(([有休残日数]*8-[取得日数]*8-[取得時数])/8) & "日"

取得後時数:([有休残日数]*8-[取得日数]*8-[取得時数]) Mod 8 & "時間"

という2つのテーブルを作っていましたが、考え直してみます。

どうもありがとうございます。
・ツリー全体表示

【12990】Re:1日を8時間に
回答  かるびの  - 16/4/17(日) 17:01 -

引用なし
パスワード
    テーブルには、有給休暇を1時間を単位として格納しておき、
それをフォームで表示するときは、「有給休暇」フィールドの合計を8で割る
という方法はどうですか。

 ちなみに、このような計算を行う方法として、
クエリで行い、このクエリをフォームのレコードソースとするという方法、
又は、フォームに配置するテキストボックスのコントロールソースで行う方法
が考えられます。

 前者であれば、有給休暇の合計について、「日」部分と日未満の「時間」部分とは
別の演算フィールドとすることになると思います。
 後者でも、有給休暇の合計の「日」部分と日未満の「時間」部分とは
別のテキストボックスにすることになると思います。
・ツリー全体表示

【12989】1日を8時間に
質問  まさし  - 16/4/17(日) 8:13 -

引用なし
パスワード
   はじめまして、
まさしといいます。

VBAのことでなくすみません。

有給休暇の計算をするのに
1日は8時間
と定義づけたいです。

(例)先月は有休5時間とった。
   今月は有休6時間とった。
   あわせて1日と3時間とった。

このように出来るようにしたいです。
ですが、いろんな検索をかけてもやり方が分からずに困っています。
良い方法があれば教えてください。
よろしくお願いします。
・ツリー全体表示

【12988】ツールバー表示
質問  sanfuu  - 16/4/15(金) 20:43 -

引用なし
パスワード
   windows10(surfacepro4)にaccess2013をインストールしました。
VBAのモジュール画面でデバッグ等のツールバーが表示されません。
今現在windows7,8.1パソコンではツールバーが表示されています。
windows10(surfacepro4)で表示する設定をご教授下さい。
・ツリー全体表示

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