AIと戦って、あなたの人生のリスク診断 >>

入庫.xlsに現在、"原紙"というシートがあります。
入庫.xlsには、"原紙"と入庫のあった日のシートがあるようにしたいのです。
今日、入庫があれば、入庫.xlsには
"原紙"と"20"のシートが存在するようにしたいのです。
AccessのVBAにて1文でシートのコピーってできないでしょうか?
Dim oApp As Object
Dim StWk1 As String
Dim SHizk As String
Dim Hizk As Integer
Hizk = DatePart("d", Me![入庫日付])
SHizk = CStr(Hizk)
StWk1 = "c:入庫.xls"
Set Xls = GetObject(StWk1)
Xls.Application.Windows(1).Visible = True
Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk)
Xls.Application.worksheets(SHizk).Activate

上記のように作成してみたのですが、実行すると、
Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk)
のところで、エラーになります。
実行エラー'9':
インデックスが有効範囲にありません。
のメッセージが表示されます。
教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Private Sub CmdCopySheet_Click()


  
  'Dim xlApp As Excel.Application
  'Dim xlBook As Excel.Workbook
  'Dim xlSheet As Excel.Worksheet
  Dim xlApp As Object
  Dim xlBook As Object
  Dim xlSheet As Object
  Dim stFileName As String
  Dim stSheetName As String
  Dim lngCnt As Long
  
  'ファイル名指定
  stFileName = "C:\入庫.xls"
  
  'コピーシート名指定
  stSheetName = Format(Date, "dd")
  
  'エクセル展開
  'Set xlApp = New Excel.Application
  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Open(stFileName)
  
  'コピー先取得
  For Each xlSheet In xlBook.Worksheets
    If xlSheet.Name = stSheetName Then
      If Len(stSheetName) = 2 Then
        stSheetName = stSheetName & " (2)"
      Else
        stSheetName = Left(stSheetName, 2) & " (" & Val(Mid(stSheetName, 5)) + 1 & ")"
      End If
    End If
    lngCnt = lngCnt + 1
  Next
  
  'シートコピー
  Set xlSheet = xlBook.Worksheets("原紙")
  xlSheet.Copy , xlBook.Worksheets(lngCnt)
  
  'シート名変更
  lngCnt = lngCnt + 1
  Set xlSheet = xlBook.Worksheets(lngCnt)
  xlSheet.Name = stSheetName
  
  'エクセルファイルを閉じる
  xlBook.Close (True)
  xlApp.Quit
  
  'オブジェクトの開放
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
  
  '完了メッセージ
  MsgBox "シートをコピーしました"
  
End Sub

作成時は、参照設定で「Microsoft Excel *.* Object Library」にチェックをつけておくと楽ですよ
作成し終わったら、CreateObjectを使って参照設定を元に戻しておけば、バージョン違いのエクセルにも対応できます
    • good
    • 0

Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk)


ですが、After は、コピーしたシートを After で指定したシートの後ろに挿入するということなんですが、実行時にまだ存在しないシートを指しているので、エラーになるようです。
Xls.Application.worksheets(SHizk).Activate
も同様です。
    • good
    • 0

これって今書いているソースのコピペですか?



パッと見ておかしいと思ったのは

StWk1 = "c:入庫.xls"
      ↓
StWk1 = "c:\入庫.xls"
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアクセスからエクセルのシートを追加して、名前をつける方法

アクセス2000で、ある所定の条件を満たした時に、規定の場所にあるエクセルファイルの先頭から2番目に空のワークシートを追加し、そのシート名を変数に格納されている値でリネームしようとしております。結構急務なんですが、excel.application~等使っても出来ませんでした・・・。プロフェッショナルな方、誰か方法を教えていただけないでしょうか?よろしくお願いします。

Aベストアンサー

こんにちは。

急ぎということで、取り急ぎで作ったコードです。目的の処理以外は一切おこなっていませんので、カスタマイズしてください。

また、処理速度の点で実行時バインドではなく、参照設定を予め行って下さい。


Option Compare Database

'要参照設定:Microsft Excel x.x Object Library
Sub AddXLWorksheet()

  Dim xlApp As Excel.Application
  Dim WB As Excel.Workbook
  Dim SH As Excel.Worksheet
  Dim strXLfile as stirng

  strXLfile = "C:\TEST.xls" 'Excelブックフルパス

  Set xlApp = Excel.Application
  With xlApp
    .Visible = True
    Set WB = .Workbooks.Open(strXLfile)
    'シートを3番目に追加
    Set SH = .Worksheets.Add(After:=WB.Worksheets(2))
    'シート命名
    SH.Name = "aaaaa" 'ここを変数で渡せば良い
  End With

  Set SH = Nothing
  Set WB = Nothing
  Set xlApp = Nothing

End Sub

こんにちは。

急ぎということで、取り急ぎで作ったコードです。目的の処理以外は一切おこなっていませんので、カスタマイズしてください。

また、処理速度の点で実行時バインドではなく、参照設定を予め行って下さい。


Option Compare Database

'要参照設定:Microsft Excel x.x Object Library
Sub AddXLWorksheet()

  Dim xlApp As Excel.Application
  Dim WB As Excel.Workbook
  Dim SH As Excel.Worksheet
  Dim strXLfile as stirng

  strXLfile = "C:\TEST.xls" 'Excel...続きを読む

QAccess-VBAでExcelファイルを作成する。

こんにちわお世話になります。

「Excelにエクスポート」ボタンをクリックすると、Inputboxか何かが表示されて、Pathやファイル名やシート名を入力し、「実行」ボタンを押すと、新規にExcelのBookを、そのPath、ファイル名、シート名で作成する。その後、そのシートにデータを書き込むという作業をしたいのです。
AccessのデータをExcelの任意のシートを開いて書き込むという部分のVBAコードはわかりますので、新規Book作成部分のコードがわかるかたお願いします。
Office97を使用しています。

Aベストアンサー

プロジェクト→参照設定でMicrosoft Excel *.* ObjectLibraryにチェックを入
れて下さい。

オブジェクトへの参照を格納する変数を事前バインディング。
変数にオブジェクトの参照を代入します。Addメソッドを使って新規workbookと
worksheet オブジェクトを作成します。
値を代入し名前を付けて保存してオブジェクトを開放する。という流れで良いと
思います。

Private Sub Command1_Click()

  On Error Resume Next

  Dim xlApp  As Excel.Application
  Dim xlBook As Excel.Workbook
  Dim xlSheet As Excel.Worksheet

  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Add
  Set xlSheet = xlBook.Worksheets(1)

  ' Excel のセルに値を代入します。
  xlSheet.Cells(1, 1).Value = " "

  ' Worksheet を名前をつけて保存します。ダイアグボックス等を使用して
   パスやBook名など入力できるようにしてもOKです。
  xlSheet.SaveAs "c:\Temp.xls"

  xlApp.Quit

  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
End Sub

こんな感じでしょうか。

プロジェクト→参照設定でMicrosoft Excel *.* ObjectLibraryにチェックを入
れて下さい。

オブジェクトへの参照を格納する変数を事前バインディング。
変数にオブジェクトの参照を代入します。Addメソッドを使って新規workbookと
worksheet オブジェクトを作成します。
値を代入し名前を付けて保存してオブジェクトを開放する。という流れで良いと
思います。

Private Sub Command1_Click()

  On Error Resume Next

  Dim xlApp  As Excel.Application
  Dim xlBook As Excel.Workbook
...続きを読む

QACCESS、VBAでEXCELファイルをコピーはできますか

ACCESS、VBAでEXCELファイルをコピーはできますか。
同じフォルダーにあるEXCELファイル:Aファイルを削除してA_BACKファイルをAファイルとしてコピーしたい。
宜しくお願いします。

Aベストアンサー

Excelファイルの複製でしたら、FileCopyを使用すれば可能だと思います:
http://www.tsware.jp/tips/tips_302.htm

ご質問の内容であれば、仮にcドライブ直下であれば以下のようになります:
FileCopy "c:\A_BACK.xls", "c:\A.xls"


なお、古いファイル「A.xls」を明示的に削除しなくても、上書きされます。
逆にいうと上書き時に確認Msgが出ないので、その確認もしたい場合は、
FileExistを使用してファイルの有無を確認するコードを作る必要があります。
http://www.tsware.jp/tips/tips_103.htm

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QAccess エクセルシート名変更

お世話になります。
WindowsXPでAccess2002を使用しているのですが、AccessVBAを使い特定のエクセルシートのシート名を変更したいと考えているのですが、いろいろ方法を検索しているのですが、そのような事例を発見する事ができませんでした。

引き続き調べて行きますが、良い方法がありましたら、ご教授いただけないでしょうか。
宜しくお願いします。

Aベストアンサー

Excelがインストールされている環境なら
CreateObjectやNewでExcel.Applicationオブジェクトを作成して
その上で Bookを読み込み Worksheetの名前を変更すればいいのでは

sub Macro1()
Dim oXL as Object
Dim oWB as Object
Dim oSH as Object]
  Set oXL = CreateObject("Excel.Application")
  Set oWB = oXL.WorkBooks.Open("ブックのファイルパス")
  Set oSH = oWB.Worksheeets("シート名")
  oSH.Name = "変更後のシート名"
  oWB.Save
  oWB.Close
  oXL.Quit
  Set oSH = nothing
  Set oWB = nothing
  Set oXL = nothing
End Sub
といった具合でしょう

QACCESSからexcelブックを開いて保存したい

ACCESS初心者です。
仕事でどうしても必要に迫られて、受付管理のツールを作ることになりました。


1つの注文で、受付ID(オートナンバー)が付与されます。

メインフォームにタブオーダーをつけてサブフォームを複数配置しています。
そのサブフォームにボタンを置いて
Access から既存のエクセルファイルをテンプレートとして開いて
テンプレートに入力後、受付IDをファイル名にして、テンプレートとは別もので保存
保存後は、ボタンを押したときに受付IDと同じエクセルファイルが開く

このようなことをやりたいと思っています。

ネットでいろいろ探しているのですが
ファイルを開くのは見つかっても、保存したものを開くのが見つからず
そもそもできるのかどうかもわかっておりません。

自分にスキルがなく、あれこれ凝ったものは作れないので、
保存は自動じゃなくて、自分で別名で保存にしてもかまわないのですし
フォームに入力したものが、テンプレートに反映(出力?)されなくてもかまわないです。


参考になるサイト等ありましたら、ご教示いただけますか。

どうぞよろしくお願いいたします。


下記はやりたいことに近いかなと思って見つけたサイトです。
http://www.nurs.or.jp/~ppoy/access/access/acX013.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220895032
http://accessclub.jp/bbs/0227/beginers70136.html

ACCESS初心者です。
仕事でどうしても必要に迫られて、受付管理のツールを作ることになりました。


1つの注文で、受付ID(オートナンバー)が付与されます。

メインフォームにタブオーダーをつけてサブフォームを複数配置しています。
そのサブフォームにボタンを置いて
Access から既存のエクセルファイルをテンプレートとして開いて
テンプレートに入力後、受付IDをファイル名にして、テンプレートとは別もので保存
保存後は、ボタンを押したときに受付IDと同じエクセルファイルが開く

このよう...続きを読む

Aベストアンサー

1番目のリンクの方のサイト、すごいですね。テクニカルかつ分かりやすいです。
同じ方のサイト、#001ではEXCELファイルを新規に作って、データベース内のデータを埋めて保存して閉じる
やり方を紹介しています。
http://www.nurs.or.jp/~ppoy/access/access/acX001.html

リンクの#013では、テンプレートを元にデータを埋め込み、EXCELの画面を表示したところで、マクロを終了させる
(保存はユーザーの手動に任せる)方法を紹介しています。

この#013の最後に#001の保存方法を組み合わせれば、たぶん出来ると思います。

#013の末尾(http://www.nurs.or.jp/~ppoy/access/access/acX013.html)
--------------------------------------------------------------
'データ貼り付け
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
End With

'#001の保存コード(http://www.nurs.or.jp/~ppoy/access/access/acX001.html)

'保存ダイアログからの入力を受けて保存
' fName = xls.Application.GetSaveAsFilename(,"Microsoft Excel(*.xls),*.*", 1)

'保存ダイアログを使わず、fnameを自動的に指定する方法(jacob-wk9付け足し)
fName=rst!受付ID

If fName <> False Then
wkb.SaveAs FileName:=fName
MsgBox "新規ブックは、「" & fName & "」の名前で保存しました!", vbOKOnly
Else
MsgBox "新規ブックは保存できませんでした。", vbOKOnly
End If

Set rst = Nothing: Set cnn = Nothing

Exit_opnXLtmp:
Set wkb = Nothing: Set xls = Nothing
Exit Sub

Err_opnXLtmp:
MsgBox Err.Description
Resume Exit_opnXLtmp
End Sub
----------------------------------------------------------------------

こんな感じになるのではないでしょうか。

1番目のリンクの方のサイト、すごいですね。テクニカルかつ分かりやすいです。
同じ方のサイト、#001ではEXCELファイルを新規に作って、データベース内のデータを埋めて保存して閉じる
やり方を紹介しています。
http://www.nurs.or.jp/~ppoy/access/access/acX001.html

リンクの#013では、テンプレートを元にデータを埋め込み、EXCELの画面を表示したところで、マクロを終了させる
(保存はユーザーの手動に任せる)方法を紹介しています。

この#013の最後に#001の保存方法を組み合わせれば、...続きを読む

QAccess VBAよりExcelのシート名を取得

お世話になります。
Access2010
Windows7 Pro

以下のページを参考にしましたが、「実行時エラー3170 インストール可能なISAMドライバーが見つかりませんでした。」と表示されてしまいます。

http://www.accessclub.jp/bbs5/0005/vba1231.html
Dim Db As DAO.Database
Dim Tbl As DAO.TableDef
Dim xlsFile As String

xlsFile = "ファイルパス"
Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる
For Each Tbl In Db.TableDefs
If Right$(Tbl.Name, 1) = "$" Or _
Right$(Tbl.Name, 2) = "$'" Then
'シート名の最後は必ず$が付きます
Debug.Print Tbl.Name
End If
Next Tbl
Db.Close
Set Db = Nothing

なお、参照設定にて「Microsoft DAO 3.6 Object Library」にチェックが入っていないことが原因かと思い、チェックを入れようとしましたが「この名前は既にあるモジュール、プロジェクト、オブジェクトライブラリで使われています。」というメッセージが表示され、チェックを入れることができません。

勉強不足で大変恐縮ですが、これらのメッセージからどういうことが分かりますでしょうか。
ご教授の程、宜しくお願い致します。

お世話になります。
Access2010
Windows7 Pro

以下のページを参考にしましたが、「実行時エラー3170 インストール可能なISAMドライバーが見つかりませんでした。」と表示されてしまいます。

http://www.accessclub.jp/bbs5/0005/vba1231.html
Dim Db As DAO.Database
Dim Tbl As DAO.TableDef
Dim xlsFile As String

xlsFile = "ファイルパス"
Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる
For Each Tbl In Db.TableDefs
If Right$(Tbl.Name, 1) = "$" Or _
Right$(...続きを読む

Aベストアンサー

Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる

Set Db = OpenDatabase(xlsFile, True, True, "Excel 12.0;") '←ここで止まる
ならOffice2010では出来ましたよ?
アプリケーションのバージョンではなくファイルのバージョン指定っぽいです。

ちょっと蛇足かもしれんが、参考になると思われます。
・・・本来 Null でない Excel 列内の一部の値が Null として返されることがあります・・・
http://support2.microsoft.com/kb/194124/ja

>この名前は既に・・・
Microsoft DAO 3.6 Object Library の上位バージョンの
Microsoft Office 14.0 Access Database Engine Object Library に
チェックが入っていれば OK です。

Qアクセスvbaでエクセルブックを保存

アクセス初心者です。よろしくお願いします。
アクセスのフォームに表示したデータをエクセルのシートにコピーして名前を付けて保存させたいです。
テーブル等のエクスポートではありませんのでDoCmdでの保存ではなくSaveAsで保存したいです。
いろいろなサイトを見て新規ブックを開いて保存することはできましたが、既存ブックを開いて別名で保存しようとするとオブジェクト云々、オートメーション云々のエラーになります。
検索したサイトからの引用ですが、
  Set xlBook = xlApp.Workbooks.Add
  Set xlSheet = xlBook.Worksheets(1)
  xlSheet.SaveAs "c:\Temp.xls"
はできるのですが、
  Set xlBook = xlApp.Workbooks.Open("C:\temp\原紙.xls")
  Set xlSheet = xlBook.WorkSheets(1)
  fname = "C:\temp\" & Format(Date, "yyyymmdd") & "売上一覧.xls"
  xlBook.SaveAs Filename:=fname
だとエラーになります。
既に書式等を設定したブックを使いたいので後者のように既存のブックを使いたいのですが、どうしたらよろしいでしょうか。
職場に端末を持ち込めないため対応が遅くなりますがよろしくお願いします。

アクセス初心者です。よろしくお願いします。
アクセスのフォームに表示したデータをエクセルのシートにコピーして名前を付けて保存させたいです。
テーブル等のエクスポートではありませんのでDoCmdでの保存ではなくSaveAsで保存したいです。
いろいろなサイトを見て新規ブックを開いて保存することはできましたが、既存ブックを開いて別名で保存しようとするとオブジェクト云々、オートメーション云々のエラーになります。
検索したサイトからの引用ですが、
  Set xlBook = xlApp.Workbooks.Add
  Se...続きを読む

Aベストアンサー

昔の記憶を頼りに・・・。
1:新規ブックを開く。
2:ワークシートを全て削除
3:既存のブックを開く。
4:既存のブックのシートを新規ブックにコピー
5:新規ブックを保存
※その他の処理は省略。

おおざっぱですが、こんな感じで出来たように記憶しています。
参考までに・・・。

' 新規Sheetを開き、ワークシートを空にする。
Set nlBook = nlApp.Workbooks.Add
Dim i As Integer
For i = nlBook.Worksheets.Count To 1 Step -1
nlBook.Worksheets(i).Delete
Next i

' 元になるSheetを開く
Set olBook = olApp.Workbooks.Open("C:\temp\原紙.xls")
Set olSheet = olBook.WorkSheets(1)

' 元になるシートを新規にコピーする
olSheet.Copy After:=nlBook.Worksheets("Sheet1")

' 新規Sheetを保存する
fname = "C:\temp\" & Format(Date, "yyyymmdd") & "売上一覧.xls"
nlBook.SaveAs Filename:=fname

昔の記憶を頼りに・・・。
1:新規ブックを開く。
2:ワークシートを全て削除
3:既存のブックを開く。
4:既存のブックのシートを新規ブックにコピー
5:新規ブックを保存
※その他の処理は省略。

おおざっぱですが、こんな感じで出来たように記憶しています。
参考までに・・・。

' 新規Sheetを開き、ワークシートを空にする。
Set nlBook = nlApp.Workbooks.Add
Dim i As Integer
For i = nlBook.Worksheets.Count To 1 Step -1
nlBook.Worksheets(i).Delete
Next i

' 元になるSheetを開く
Set olBoo...続きを読む

QAccessからExcelファイルのデータ取得

Access2000かExcelファイルのデータを取得したいのですが、
Excelファイルを一度 CSVファイルに変換し、その後Accessのテーブルへデータ取り込み といった手順をとりたいのです。
この方法って、どうコーディングすればいいのですか?
(Accessのインポート処理は使用しない方法です)

Aベストアンサー

VBAの基本的なことはご存知ですか?
でしたら、
1.Accessで対象のExcelファイルを選択
2.AccessからExcelを制御してCSVにコンバート
3.出来たCSVファイルをAccessに取り込む(テキスト取り込み インポート定義を使うと簡単)
この順序で行えばOKです。
ExcelでVBAを書くことで制御する方法もありますが、
Access側からExcelを制御する方がやりやすいと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング