A. VBA+備份文件
Sub SaveWorkbookBackup()
Dim awb As Workbook, BackupFileName As String, i As Integer, OK As Boolean
If TypeName(ActiveWorkbook) = "Nothing" Then Exit Sub
Set awb = ActiveWorkbook
If awb.Path = "" Then
Application.Dialogs(xlDialogSaveAs).Show
Else
BackupFileName = awb.FullName
i = 0
While InStr(i + 1, BackupFileName, ".") > 0
i = InStr(i + 1, BackupFileName, ".")
Wend
If i > 0 Then BackupFileName = Left(BackupFileName, i - 1)
BackupFileName = BackupFileName & ".bak"
OK = False
On Error GoTo NotAbleToSave
With awb
Application.StatusBar = "Saving this workbook..."
.Save
Application.StatusBar = "Saving this workbook backup..."
.SaveCopyAs BackupFileName
OK = True
End With
End If
NotAbleToSave:
Set awb = Nothing
Application.StatusBar = False
If Not OK Then
MsgBox "Backup Copy Not Saved!", vbExclamation, ThisWorkbook.Name
End If
End Sub
如果想運行或保存VBA(宏)於另存的文件,請自選要保存的文件的種類。
B. VBA把excel備份至SQL或者實現數據交換 提示下標越界 重金懸賞大神解決
根據您的數據表的格式及資料庫管理的性能,您要想實現多處隨意動態更新,我覺得是有難度的!
1、你的表格首先沒有標定的唯一行(也就是資料庫表中的鍵值),因此不管是哪個操作者任意更新一行或增加(刪除)一行(或修改一行中某元的內容)形成新的數據表格後,在資料庫中是很難界定的(這一點不知道您是否理解!)。如果沒有唯一(鍵值)來約束的話,只能按順序的方式來從資料庫中下載內容到Excel或者將現在的Excel數據更新到資料庫中。也就是說:Excel文件的當前操作者最好是一個,因為多個操作者不能實現數據同步的,資料庫只能保留最後的更新者的數據。除非你把Excel表中的某一列標示為整個表格中的唯一一行(也就是資料庫表中鍵值)
2、根據以上分析的結果,只好在 Excel 中使用兩項功能,「下載」和「上傳」
「下載」就是每次在操作之前,先把資料庫中的內容更新到 Excel文件的Sheet 中。
如:
Dim i As Integer
Dim n As Integer
Dim mySheet As Worksheet
Dim conStr As String
Dim mySQL As String
Dim conn As New ADODB.Connection
Dim sn As New ADODB.Recordset
Set meSheet = Sheet2 '用一個新的Sheet表單
conStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa; Password=xxx; Data Source =電腦名(或IP地址);Initial Catalog=資料庫名;"
conn.Open conStr
mySQL = "SELECT * FROM 表名稱"
sn.Open mySQL, conn, adOpenStatic, adLockReadOnly
『可以把欄位名稱做為 Excel表的第一行,也可以不要下面的循環
If Not sn.BOF And Not sn.EOF Then
For i = 0 To sn.Fields.Count - 1
meSheet.Cells(1, i + 1) = sn.Fields(i).Name
Next i
End If
'從第二行開始寫數據
n = 2
Do While Not sn.EOF
For i = 0 To sn.Fields.Count - 1
meSheet.Cells(n, i + 1) = sn(i)
Next i
n = n + 1
sn.MoveNext
Loop
'數據已經從資料庫下載到當前的Sheet完成
當你把數據修改完後可以把整個數據表更新到資料庫,實現"上傳"功能
如:
Dim i As Long
Dim meSheet As Worksheet
Dim conStr As String
Dim mySQL As String
Dim conn As New ADODB.Connection
Dim sn As New ADODB.Recordset
Set meSheet = Sheet2
conStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa; Password=xxx; Data Source =電腦名(或IP地址);Initial Catalog=資料庫名;"
conn.Open conStr
'需要將原來資料庫中的數據刪除掉
conn.Execute "DELETE FROM 表名"
mySQL = "SELECT * FROM 表名"
sn.Open mySQL, conn, adOpenDynamic, adLockOptimistic
'循環增加數據(也可以用SQL語句(INSERT INTO)逐行增加)
For i = 2 To 65535(最大行數,不一定到65535,因為後面也許是空值)
sn.AddNew
sn(0) = meSheet.Cells(i, 1)
sn(1) = meSheet.Cells(i, 2)
...多少根據列數來定
sn(7) = meSheet.Cells(i, 7)
sn.Update
Next i
更新完成.
C. 關於excel中利用vba將數據保存到SQL的問題
INSERT INTO TT(iYear,iMonth,Dept,Amount,Account,FA) SELECT iYear,iMonth,Dept,Amount,Account,FA" & _
" FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','DataSource=""" & strTempSourcePath & "\Source\"& strTempSourceName & _
""";User ID=ADMIN;Password=;Extended properties=Excel5.0')...[" & strSheetName(iMonth) & "$]
D. EXCEL如何使用VBA實現把工作表數據備份至SQL資料庫
數據沒有唯一性做不到,無法從庫中定位你修改的記錄,如果再有其他列可以輔助確定每一行能與其他區分開是可以的。
E. VBA如何復制或備份已打開的access文件
試試下面的代碼:
SubRefresh_Data()
DimConnAsNewADODB.Connection
DimstrConnAsString
DimstrSQLAsString
DimrsAsNewADODB.Recordset
DimMax_rowAsInteger
Stpath=ThisWorkbook.Path&Application.PathSeparator&"test.accdb"'設定access文件路徑
Conn.Provider="Microsoft.ACE.OLEDB.12.0"
strConn="DataSource="&Stpath
strSQL="select*fromreport_summary"
'打開資料庫
Conn.Open(strConn)
rs.OpenstrSQL,Conn,1,1
Application.ScreenUpdating=False
Application.DisplayAlerts=False
Ifrs.BOF=FalseThen
Sheets("Database").Range("A2:AY50000").ClearContents
Sheets("Database").Range("A2").CopyFromRecordsetrs
Else
Sheets("Database").Range("A2:AY10")="0"
EndIf
rs.Close
Setrs=Nothing
Conn.Close
endsub
F. VBA把excel備份至SQL或者實現數據交換 提示下標越界 重金懸賞大神解決
根據您的數據表的格式及資料庫管理的性能,您要想實現多處隨意動態更新,我覺得是有難度的!
1、你的表格首先沒有標定的唯一行(也就是資料庫表中的鍵值),因此不管是哪個操作者任意更新一行或增加(刪除)一行(或修改一行中某元的內容)形成新的數據表格後,在資料庫中是很難界定的(這一點不知道您是否理解!)。如果沒有唯一(鍵值)來約束的話,只能按順序的方式來從資料庫中下載內容到Excel或者將現在的Excel數據更新到資料庫中。也就是說:Excel文件的當前操作者最好是一個,因為多個操作者不能實現數據同步的,資料庫只能保留最後的更新者的數據。除非你把Excel表中的某一列標示為整個表格中的唯一一行(也就是資料庫表中鍵值)
2、根據以上分析的結果,只好在
Excel
中使用兩項功能,「下載」和「上傳」
「下載」就是每次在操作之前,先把資料庫中的內容更新到
Excel文件的Sheet
中。
如:
Dim
i
As
Integer
Dim
n
As
Integer
Dim
mySheet
As
Worksheet
Dim
conStr
As
String
Dim
mySQL
As
String
Dim
conn
As
New
ADODB.Connection
Dim
sn
As
New
ADODB.Recordset
Set
meSheet
=
Sheet2
'用一個新的Sheet表單
conStr
=
"Provider=SQLOLEDB.1;Persist
Security
Info=True;User
ID=sa;
Password=xxx;
Data
Source
=電腦名(或IP地址);Initial
Catalog=資料庫名;"
conn.Open
conStr
mySQL
=
"SELECT
*
FROM
表名稱"
sn.Open
mySQL,
conn,
adOpenStatic,
adLockReadOnly
『可以把欄位名稱做為
Excel表的第一行,也可以不要下面的循環
If
Not
sn.BOF
And
Not
sn.EOF
Then
For
i
=
0
To
sn.Fields.Count
-
1
meSheet.Cells(1,
i
+
1)
=
sn.Fields(i).Name
Next
i
End
If
'從第二行開始寫數據
n
=
2
Do
While
Not
sn.EOF
For
i
=
0
To
sn.Fields.Count
-
1
meSheet.Cells(n,
i
+
1)
=
sn(i)
Next
i
n
=
n
+
1
sn.MoveNext
Loop
'數據已經從資料庫下載到當前的Sheet完成
當你把數據修改完後可以把整個數據表更新到資料庫,實現"上傳"功能
如:
Dim
i
As
Long
Dim
meSheet
As
Worksheet
Dim
conStr
As
String
Dim
mySQL
As
String
Dim
conn
As
New
ADODB.Connection
Dim
sn
As
New
ADODB.Recordset
Set
meSheet
=
Sheet2
conStr
=
"Provider=SQLOLEDB.1;Persist
Security
Info=True;User
ID=sa;
Password=xxx;
Data
Source
=電腦名(或IP地址);Initial
Catalog=資料庫名;"
conn.Open
conStr
'需要將原來資料庫中的數據刪除掉
conn.Execute
"DELETE
FROM
表名"
mySQL
=
"SELECT
*
FROM
表名"
sn.Open
mySQL,
conn,
adOpenDynamic,
adLockOptimistic
'循環增加數據(也可以用SQL語句(INSERT
INTO)逐行增加)
For
i
=
2
To
65535(最大行數,不一定到65535,因為後面也許是空值)
sn.AddNew
sn(0)
=
meSheet.Cells(i,
1)
sn(1)
=
meSheet.Cells(i,
2)
...多少根據列數來定
sn(7)
=
meSheet.Cells(i,
7)
sn.Update
Next
i
更新完成.
G. 用VBA代碼實現在EXCEL自動備份
你的事件用得不正確,你不是要在關閉工作簿時才選擇是否備份嗎,下面是按你的要求寫的代碼,供你參考:(在代碼是盡量不用On Error Resume Next,否則代碼有問題都查不出來)
PrivateSubWorkbook_BeforeClose(CancelAsBoolean)
DimPa$,Str1$
Pa="E:我的備份"
IfDir(Pa,vbDirectory)=""ThenMkDirPa:SetAttrPa,2'創建文件夾並隱藏
Str1=ThisWorkbook.Name
ThisWorkbook.Save'先保存自身文件
Application.DisplayAlerts=False'覆蓋備份文件時不提示
IfMsgBox("是否備份?",vbYesNo)=vbYesThen_
ThisWorkbook.SaveAsPa&Left(Str1,InStr(Str1,".")-1)&"備份"&Format(Date,"yyyy-mm-dd")&".xlsm"
Application.DisplayAlerts=True
EndSub
H. VBA如何讓EXCEL保存文件時自動生成備份文件,並且可以選擇備份路徑,另外可否設置備份文件為只讀
這個可以彈出路徑選擇對話框並且將備份設為只讀的。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim flag As Boolean
dim fm as string
flag = False
Do While Not flag
fm = Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls),*.xls,All files (*.*),*.*")
If fm <> False Then
Application.EnableEvents = False
ActiveWorkbook.SaveCopyAs fm
Application.EnableEvents = True
flag = True
End If
Loop
SetAttr pathname:=fm, Attributes:=vbReadOnly
End Sub