Access VBA質問箱 IV

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

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


105 / 2272 ツリー ←次へ | 前へ→

【12996】ファイル取り込み M・A・D 16/5/1(日) 15:22 質問[未読]
【13000】Re:ファイル取り込み M・A・D 16/5/4(水) 20:16 発言[未読]
【13002】Re:ファイル取り込み 亀マスター 16/5/5(木) 23:08 回答[未読]
【13003】Re:ファイル取り込み M・A・D 16/5/7(土) 2:21 発言[未読]
【13004】Re:ファイル取り込み 亀マスター 16/5/7(土) 21:11 回答[未読]
【13005】Re:ファイル取り込み M・A・D 16/5/8(日) 2:36 発言[未読]
【13006】Re:ファイル取り込み 亀マスター 16/5/8(日) 5:47 回答[未読]
【13007】Re:ファイル取り込み M・A・D 16/5/8(日) 22:51 発言[未読]
【13008】Re:ファイル取り込み 亀マスター 16/5/9(月) 0:27 回答[未読]
【13009】Re:ファイル取り込み M・A・D 16/5/9(月) 22:45 お礼[未読]

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

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

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

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

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

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

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

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

【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のメニューの外部データの取り込みのインポートやリンクを実行してしまったためにプログラムに余計な行が追加されてしまっているかもしれません。

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

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

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

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

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

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

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

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

【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等教えていただけないでしょうか?

【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

【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
ありがとうございます。

【13008】Re:ファイル取り込み
回答  亀マスター  - 16/5/9(月) 0:27 -

引用なし
パスワード
   > 何か適当な同名のテーブルを作成後、今まで通り実行すると、正常なプログラムの流れに戻ってエラーがなくなるということでよろしいでしょうか?
そういうことです。

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

※念のため、以下の操作をする前にコピーをとっておいた方が良いかも。
問題のAccessファイルをシフトキーを押しながらダブルクリックして開いて(シフトキーはなしでも問題ないかもしれませんが、起動時に何かのプログラムが自動で動くのを防ぐためにしています)、上の方にあると思われる「作成」→「テーブル」(Accessのバージョンによって多少違うかもしれません)とすると空っぽのテーブルができますので、上書き保存して、テーブルの名前を「T_Sample&POP」としてみてください。

>真ん中より少し上のほうに「On Error GoTo Error1」ってのもありますが、これも含めてすべて消すということでしょうか?
「On Error GoTo Error1」を含む部分はエクセルデータの取り込みとは関係ないようですので、そこは放置でいいでしょう。
あと、この方法はエラーの箇所を特定するためにやっているだけで、特定後は元に戻さないといけないので、その辺がややこしいと感じるなら、エラー特定用のファイルは別にコピーしたものを使う方が良いでしょう。
ちなみに、On Error GoTo ○○というのは、この行以降でエラーが起こった場合、プログラムを中断せずに○○というタグを付けたところ(大抵はプログラムの下の方にあります)に行けという命令です。

ところで、示していただいたプログラム中に、あなたが所属する組織の名前を示すのではないかと思われる箇所があります。また、パソコン名を示すと思われる部分もありますので、見る人が見れば特定されてしまいますよ。こういう掲示板に投稿する際はご注意を。(構わないのならいいですが)

【13009】Re:ファイル取り込み
お礼  M・A・D  - 16/5/9(月) 22:45 -

引用なし
パスワード
   忠告ありがとうございます。
レスがついているものは削除できないみたいですね、以後注意します。

修正結果を言わせてもらうと。適当なテーブルを追加した結果、無事エラーなく動きました。ありがとうございました。

105 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free