
VBA超初心者です。宜しくお願いします。
今回は、テーブルからエクセルへ出力後、最終レコードの次の行に任意の文字を入れたいというのがわからず質問です。
全体の流れとしては、エクセル起動→テーブル名1を出力→テーブル名2を出力→CSV形式で保存となります。
このテーブル名2を出力した際の処理についてです。以下の記述の中で、”★★テーブル名2を貼り付け”の処理を追加、変更などする形で考えたいのですが、よい方法はございませんでしょうか?
具体的には【テーブル名2をエクセルの任意の範囲に出力】→最終レコードの次行の特定の列を複数指定して任意の文字”END”を入れる。
(例:貼り付け開始がB25、データが3レコードであれば、28行目の任意の列(CとE)を指定して”END"といれる)
なお、テーブル名2のレコード数は毎回ことなります。
説明不足の場合はご指摘ください。
御知恵を拝借したく宜しくお願いします。
---------------------------
Sub opnXLtmp3()
On Error GoTo Err_opnXLtmp3
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim cnn2 As ADODB.Connection
Dim rst2 As ADODB.Recordset
Dim stBasis As String
Dim stDetail As String
Dim xls As Excel.Application
Dim wkb As Excel.Workbook
Dim fName As Variant
Dim stPath As String 'mdb & Excel Book Path
Dim stXLName As String 'Book Name
Dim stSheet As String 'Sheet Name
Dim stRng As String 'Range Address
stPath = CurrentProject.Path '自mdb & Excel Book のパス
stXLName = "ファイル名.csv" 'テンプレート用の Book
stBasis = "テーブル名1" 'テーブル名1
stDetail = "テーブル名2" 'テーブル名2
stSheet = "シート名" '出力するシート名
stRng = "B25" '出力開始セル番地
Set cnn = CurrentProject.Connection
Set cnn2 = CurrentProject.Connection
Set rst2 = cnn2.Execute(stBasis)
Set rst = cnn.Execute(stDetail)
'テンプレート としてオープン
Set xls = CreateObject("Excel.Application")
xls.Workbooks.Add template:=stPath & stXLName
Set wkb = xls.Workbooks(1)
'テーブル名1を貼り付け
With wkb.Worksheets(stSheet)
.Cells(3, 10) = rst2("番号")
End With
'★★テーブル名2を貼り付け
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
'ここに .Cells(X, 3) = "END" じゃだめでした。
'ここに .Cells(X, 5) = "END" じゃだめでした。
End With
'Excel画面を表示して終了(保存しない)
xls.Visible = True
fName = xls.Application.GetSaveAsFilename("ファイル名3" & rst2("番号"), _
"CSVファイル(*.csv),*.csv", 1)
If fName <> False Then
wkb.SaveAs FileName:=fName
MsgBox "新規ブックは、「" & fName & "」の名前で保存しました!", vbOKOnly
Else
MsgBox "新規ブックは保存できませんでした。", vbOKOnly
End If
End Sub
No.2ベストアンサー
- 回答日時:
カーソルをクライアントカーソルに変更してみてください。
Set cnn = CurrentProject.Connection
cnn.CursorLocation = adUseClient <=追加
Set cnn2 = CurrentProject.Connection
Set rst2 = cnn2.Execute(stBasis)
Set rst = cnn.Execute(stDetail)
その上で最初に回答したコードでやってみてください。
No.1
- 回答日時:
'★★テーブル名2を貼り付け
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
.Cells(rst.RecordCount + 25, 3) = "END"
.Cells(rst.RecordCount + 25, 5) = "END"
End With
かな。
レコードセットのRecoudCountプロパティでレコード数を取得して、
行の初期位置に加算してやるという考え方です。
この回答への補足
すいません、訂正です。最後に試したのは以下となります。
Dim figA As Integer
figA = rst.RecordCount
figA = (figA + 25)
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
.Cells(figA, 3) = "END"
.Cells(figA, 5) = "END"
End With
早速のご回答ありがとうございます。
ご教授いただいた方法で試してみましたが当方の力量不足により
うまくいかないようです。すいません。
実行したのは以下となります。
'★★テーブル名2を貼り付け
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
.Cells(rst.RecordCount + 25, 3) = "END"
.Cells(rst.RecordCount + 25, 5) = "END"
End With
実行結果は、24行目のC列とE列に”END”と入ります。
試しに以下のように、レコード数3+1=4を追加して+29で実行すると
入れたい列(28列目)にちゃんと入りました。
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
.Cells(rst.RecordCount + 29, 3) = "END"
.Cells(rst.RecordCount + 29, 5) = "END"
End With
ということは"rst.RecordCount"が数値として認識されてない?のかなぁ?と勝手に想像し、以下もやってみましたがやっぱりダメでした。
浅はかですいません。。実行結果は24行目のC列とE列に”END”と入ります。
Dim figA As Integer
figA = rst.RecordCount
figA = (figA + 25)
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
.Cells(figA, 1) = "EOL"
.Cells(figA, 4) = "EOL"
End With
すいませんがもう少し教えていただけますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
access2000のクエリで・・・
-
Accessレコードの追加や変更が...
-
リンクテーブルを CopyObject ...
-
アクセスVBA CSVへ出力後、最終...
-
ファイルメーカー8.5
-
パススルークエリをテーブル作...
-
ACCESS クエリ(カウント0の...
-
SQL文を教えてください
-
テーブルの書き出し?
-
Accessの計算について
-
主キーが二つないと、フォーム...
-
Accessのクエリ結果について ...
-
SQL構文について教えてください
-
複数フィールドからの最新抽出...
-
注文した商品名をマスターで作るか
-
SQL Serverでの検索時の文字の...
-
DAOのTableDefs("TblName").Con...
-
私が考えたAccessのテーブル設...
-
Accessでvlookupみたいなことは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルからテーブル...
-
Accessレコードの追加や変更が...
-
Accessでvlookupみたいなことは...
-
ACCESSのSQLで数値型に変換する...
-
デザインビューで、連結式 を...
-
Accessクエリでの、LIKE条件
-
2つのテーブルを比較して一致し...
-
access テーブル内のレコード...
-
テーブル作成クエリで主キーを設定
-
SQLで条件指定結合をしたいがNU...
-
3つの表を1つに縦に連結する
-
ACCESSに同時アクセス(編集)を...
-
Accessの追加クエリで既存のテ...
-
ファイルメーカ 検索実行せず...
-
リンクテーブルを CopyObject ...
-
DAOのTableDefs("TblName").Con...
-
INSERT時にデータ登録とmaxの発...
-
ODBCで接続するとDBに変更/追加...
-
SQLで日付を条件に削除したい
おすすめ情報