|
▼hana さん:
こんばんは。
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=6470;id=excel
>を参考にさせて頂き、作成しました。
>やりたい点は、
>1.インポート先を閉じていて、インポート元となるファイルを開いた状態でインポートしたい。
> (インポート元にはシートが複数あり、そのときactiveのシートをインポートしたい。)
>2.セルAからVの2行目からのデータをインポートしたい。
> (インポート元、インポート先とも、1行目は列名を表示しているので、2行目から行いたい。)
>3.インポート先のファイルにデータを蓄積していきたい。
3回読み返しましたが、これは、エクスポートということですよね?
>Sub import()
> With ThisWorkbook.ActiveSheet.Range("A:V")
> .Formula = "=if(" & _
> "'C:\インポート元ファイルの場所\[Data.xls]ActiveSheet'!A1=" & _
'このエラーは、ActiveSheetが原因です。こういう記述はできません。
'(ActiveSheetというシート名があるなら話は違ってきますが・・・)
> """"",""""," & _
> "'C:\インポート元ファイルの場所\[Data.xls]ActiveSheet'!A1)"
> .Value = .Value
> End With
>End Sub
で、たぶんリンク貼付では無理だと思いますよ。
もし、もし、上記のようなコードで可能だとしても処理速度は大きくは変わりませんよ。
本当は、両方開いて、値を移す方法が一般的だし、簡単だし、・・・
ですが、
私も初めてだったのでTRYしてみました。
hana さんの仕様では、「アクティブシートのA列からV列の値を開いていないBOOK2.XLSに追加する」ですが、以下のコードは、A列からB列を追加するになっていますので、確認後、変更して下さい。
ADOを使いましたので、参照設定で
「Microsoft ActiveX Data Objects 2.X Library」(私は、2.5でした)を
チェックして下さい。
標準モジュール(Module1)に、
'=====================================================================
Sub main()
Dim sql_str As String
If open_ado("D:\My Documents\TESTエリア\ExportBK.xls") = 0 Then
' 接続処理 ↑ここにエクスポート先ブックをフルネームで指定
sql_str = "[Sheet1$];"
' エクスポート先のシート名の後ろに「$」を付ける
If open_rs(sql_str) = 0 Then 'レコードセットのオープン
With ActiveSheet
Set rng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
' ↑アクティブシートのA列の入力範囲を取得
End With
For idx = 1 To rng.Count
If add_rs(rng.Cells(idx).Resize(1, 2)) <> 0 Then
' ↑A列とB列を1行づつ追加 V列までなら2を22に変更
Exit For
End If
Next idx
rs_close 'レコードセットのクローズ
End If
close_ado 'エクスポートブックへの接続解除
Else
MsgBox "接続失敗"
End If
End Sub
標準モジュール(Module2)に、
'================================================================
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
'================================================================
Function open_ado(book_fullname As String) As Long
'excelブックに接続
On Error Resume Next
link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & book_fullname & ";" & _
"Extended Properties=Excel 8.0;"
cn.Open link_opt
open_ado = Err.Number
On Error GoTo 0
End Function
'================================================================
Sub close_ado()
'接続解除
On Error Resume Next
cn.Close
On Error GoTo 0
End Sub
'================================================================
Function open_rs(sql_str As String) As Long
'レコードセットのオープン
On Error Resume Next
rs_close
rs.Open sql_str, cn, adOpenStatic, adLockOptimistic
If Err.Number <> 0 Then
MsgBox Error$(Err.Number)
End If
open_rs = Err.Number
On Error GoTo 0
End Function
'=================================================================
Function add_rs(rng As Range) As Long
'データレコードの追加
On Error GoTo err_add_rs
With rs
.AddNew
For idx = 1 To rng.Count
.Fields(idx - 1).Value = rng.Cells(idx).Value
Next idx
.Update
End With
add_rs = 0
ret_add_rs:
On Error GoTo 0
Exit Function
err_add_rs:
MsgBox Error$(Err.Number)
add_rs = Err.Number
Resume ret_add_rs
End Function
'===================================================================
Sub rs_close()
'レコードセットのクローズ
On Error Resume Next
rs.Close
On Error GoTo 0
End Sub
こちらで確認した限りでは、正しく追加できていますが、
確認してみて下さい。
|
|