ADO và ConnectionString

Liên hệ QC

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,436
Nghề nghiệp
Bác sĩ
Hai 2 Hai​

Đối với ADO thì sau khi tạo connection, ta làm việc trên Connection đó với các đối tượng OLE DB Recordset như bình thường, có gì khác biệt hả anh? ADO thao tác với file text còn được mà, anh cứ coi dbf files là text file đi . Làm việc với database nói chung quanh quẩn chỉ là CRUD thôi mà (Create, Retrieve, Update, Delete).

P/S: Đừng dùng Bound control trong VB để làm việc với Database nhé, nó ko chuyên nghiệp tý nào đâu

ODBC Driver For Visual FoxPro

With a database container:
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBC;" & _
"SourceDB=c : \somepath\mySourceDb.dbc;" & _
"Exclusive=No;"

Without a database container (Free Table Directory):
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBF;" & _
"SourceDB=c : \somepath\mySourceDbFolder;" & _
"Exclusive=No;"


For more information, see: Visual FoxPro ODBC Driver and Q165492

OLE DB Data Link Connections
Data Link File (UDL)

For Absolute Path:
oConn.Open "File Name=c: \ somepath\myDatabaseName.udl;"

For Relative Path:
oConn.Open "File Name=myDatabaseName.udl;"

For more information, see: HOWTO: Use Data Link Files With ADO
Note: Windows 2000 no longer contains the "New | Microsoft Data Link"
menu anymore. You can add the Data Link menu back in the menu list
by running the "C: \ Program Files\Common Files\System\Ole DB\newudl.reg"
reg file, Then right-click on the desktop and Select "New | Microsoft Data
Link " menu."
Or you can also create a Data Link file by creating a text file and change
It 's file extension To ".udl", Then double-click the file.

OLE DB Provider For Visual FoxPro
oConn.Open "Provider=vfpoledb;" & _
"Data Source=.\MyDB.dbc;"


For more information, see: Microsoft OLE DB Provider for Visual FoxPro
 
TuanVNUI​

Function GetConnDBF(ByVal cFileName As String) As ADODB.Connection
On Error GoTo loi:
'Open the ADO connection to the Excel workbook
Dim oconn As ADODB.Connection
Set oconn = New ADODB.Connection

oconn.Open "Provider=MSDASQL;" & _
"SourceDB=" & cFileName & ";" & _
"SourceType=DBF;Exclusive=No"
loi:
Set GetConnDBF = oconn
Set oconn = Nothing
If err.Number <> 0 Then Set GetConnDBF = Nothing
End Function
================================================== ==
Sub Xuly()
Dim oconn As ADODB.Connection
Dim oRS As ADODB.Recordset

Set oconn = GetConnDBF("d: \ DATA")
cSQL = "Select * from Dmhang"
Set oRS = GetRS(cSQL, oconn)
End Sub


Khi đã nhận được Connection thì không khó gì cả.

Chỉ cần kết nối được:
oConn: Kết nối với các Database khác nhau (Access, VFP, Excel, SQL,...)
oRS=GetRS(oConn,...)
If oRS is Nothing then
Exit Sub
Endif

Thực hiện các lệnh với oRS bình thường.
 
Lần chỉnh sửa cuối:
Em có dòng code như thế này :

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Excel Files;DBQ=D:\Data\DATA.xls;DefaultDir=D:\Data;DriverId=790;MaxBuffe" _
), Array("rSize=2048;PageTimeout=5;")), Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data_Link.Ngay, Data_Link.LoaiCT, Data_Link.SoCT, Data_Link.NguoiGiaoNhan, Data_Link.TenKhachHang, Data_Link.MaVT, Data_Link.No, Data_Link.Co, Data_Link.SoLuong, Data_Link.DonGia, Data_Link.Gia" _
, _
"ChuaThue, Data_Link.ThueVAT, Data_Link.ThanhTien, Data_Link.SoHoaDon, Data_Link.NgayHoaDon, Data_Link.NgayTT, Data_Link.BaoCao" & Chr(13) & "" & Chr(10) & "FROM `D:\Data\DATA`.Data_Link Data_Link" & Chr(13) & "" & Chr(10) & "WH" _
, _
"ERE (Data_Link.Ngay Is Not Null) AND (Data_Link.No Is Not Null) AND (Data_Link.Co Is Not Null)" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Em muốn lúc nào nó cũng link từ file Data.xls ở thư muc hiện hành (hiện tại đang là D:\Data\DATA)
Liệu có cách đặt biến sao cho dù chép thư mục Data vào bất cứ đâu thì đường dẫn sẽ tự thay đổi theo không ạ ?
 
Dear MrHieu,
------------
Mr có thể sử dụng thuộc tính Path của ThisWorkbook để tham chiếu tới thông số này.
Để linh hoạt anh có thể lưu trữ thông tin này trên Worksheet và cho phép người dùng chỉnh sửa khi cần thiết.
Sử dụng hàm =CELL("filename") để tuỳ chỉnh thư mục mặc định trực tiếp trên cell dựa vào thư mục của Workbook hiện hành.
Chúc anh thành công!
 
To MrHieu!
Cách xử lý của mình như thế này không biết có phù hợp không?
Mở file Data.xls, vào VBA, nhấn đúp vào ThisWorkbook rồi thêm đoạn code sau:
Mã:
Private Sub Workbook_Open()
SaveSetting "GiaiPhapExcel", "Setting", "Pathname", ThisWorkbook.Path
SaveSetting "GiaiPhapExcel", "Setting", "Filename_Full", ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub
Đóng file Data.xls (dĩ nhiên là phải Save rồi!!)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
Cách update:
Khi nào bạn copy file Data.xls (nói chung là file chứa sự kiện Open) sang thư mục khác thì sau khi đã copy, vào Excel mở file đó ra rồi đóng lại để chương trình lưu đường dẫn và tên file....
 
nvson đã viết:
To MrHieu!
Cách xử lý của mình như thế này không biết có phù hợp không?
Mở file Data.xls, vào VBA, nhấn đúp vào ThisWorkbook rồi thêm đoạn code sau:
Mã:
Private Sub Workbook_Open()
SaveSetting "GiaiPhapExcel", "Setting", "Pathname", ThisWorkbook.Path
SaveSetting "GiaiPhapExcel", "Setting", "Filename_Full", ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub
Đóng file Data.xls (dĩ nhiên là phải Save rồi!!)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
Cách update:
Khi nào bạn copy file Data.xls (nói chung là file chứa sự kiện Open) sang thư mục khác thì sau khi đã copy, vào Excel mở file đó ra rồi đóng lại để chương trình lưu đường dẫn và tên file....

Nếu không đụng chạm đến File nguồn thì làm cách nào vậy ????
Cảm ơn nhiều !!!!!!!!!!
 
Nếu không đụng chạm đến file nguồn thì bạn thử sử dụng add-ins sau.
Thuật toán vẫn là lưu tên file, đường dẫn vào một "nơi nào đó" rồi lại "lấy ra".
Cách sử dụng:
Add-Ins file SelectFile.xla
Khi bạn thay đổi đường dẫn tới file nguồn thì bấm vào nút "Select a file" hình mặt người (cạnh nút Format Painter) để thay đổi đường dẫn trước khi mở file lấy dữ liệu.
Bạn cần chú ý là file mà bạn chọn chính là file nguồn (không nhất thiết tên là Data.xls).
(Nếu bạn mchỉ muốn file nguồn tên là Data.xls thì bạn có thể sửa Code)
Trong file muốn lấy dữ liệu bạn thêm đoạn code sau vào trước code của bạn:
Mã:
Public Sub Xy_Ly_Pathname()
Dim Pathname As String
Dim Filename_Full As String
Pathname = GetSetting("GiaiPhapExcel", "Setting", "Pathname", "0")
Filename_Full = GetSetting("GiaiPhapExcel", "Setting", "Filename_Full", "0")
'.....
'Code cua ban
End Sub
Dĩ nhiên là trong phần code của bạn, bạn thay đổi D:\Data bằng Pathname, D:\Data\Data.xls bằng Filename_Full
........
 

File đính kèm

  • Tudongthaydoi_Path.rar
    23.7 KB · Đọc: 587
Cứ phải chạy addin mới được à bác. Không có cách VD như :

Dim a as string
Dim b as string
Dim c as string

a = "D:\KeToan\DATA.xls" hay = range("A1")
b = "D:\KeToan" ...................................
c = "D:\KeToan\DATA"............................


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=Excel Files;DBQ=a;DefaultDir=b;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data.Ngay, Data.ChungTu, Data.NguoiGiaoNhan, Data.MaKhachHang, Data.NguoiPhuTrach, Data.NoiDung, Data.MaVTHH, Data.No, Data.Co, Data.ThueSuat, Data.SoLuong, Data.DonGia, Data.GiaChuaThue, Data." _
, _
"Thue, Data.GiaCoThue, Data.HachToan, Data.CongNo, Data.SoHoaDon, Data.NgayHoaDon, Data.NgayTT" & Chr(13) & "" & Chr(10) & "FROM c.Data Data" & Chr(13) & "" & Chr(10) & "WHERE (Data.ChungTu Is Not Null)" & Chr(13) & "" & Chr(10) & "ORDER BY Data.Ngay" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Ý của mình là như thế, để khi thay đổi thư mục thì nó tự động chạy thôi.
Cảm ơn nhiều.
 
Lần chỉnh sửa cuối:
Mình làm thử nhưng lại bị báo lỗi :

Dim A As String
Dim B As String
Dim C As String

A = ThisWorkbook.Path & "\Data.xls"
B = ThisWorkbook.Path
C = ThisWorkbook.Path & "\Data"


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=Excel Files;DBQ=A;DefaultDir=B;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Data.Ngay, Data.ChungTu, Data.NguoiGiaoNhan, Data.MaKhachHang, Data.NguoiPhuTrach, Data.NoiDung, Data.MaVTHH, Data.No, Data.Co, Data.ThueSuat, Data.SoLuong, Data.DonGia, Data.GiaChuaThue, Data." _
, _
"Thue, Data.GiaCoThue, Data.HachToan, Data.CongNo, Data.SoHoaDon, Data.NgayHoaDon, Data.NgayTT" & Chr(13) & "" & Chr(10) & "FROM C.Data Data" & Chr(13) & "" & Chr(10) & "WHERE (Data.ChungTu Is Not Null)" & Chr(13) & "" & Chr(10) & "ORDER BY Data.Ngay" _
)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub


1585205578311.png


02.jpg



03.jpg




Mong được giải đáp.
Cảm ơn nhiều.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Khi kết nối được thực hiện thì chương trình luôn tạo ra một name là ExternalData1; ExternalData2. . . .
Có cách nào không cho nó tạo ra được không vậy ????
 
Lần chỉnh sửa cuối:
Dear Mr???
-----------
Anh khai báo một biết strConnectString As String rồi gán vào Connection, làm như thế anh sẽ Debug được A và B có thực sự có giá trị (valid path) hay không.
 
Em có một bài toán như sau:

Để kết nối vào ORACLE có Username và Pass! Khi tạo Macro thì bảng dữ liệu trong oracle quá lớn >>>65538! Nên em muốn kết nối thì có form hiện ra để đặt điều kiện ngày = hoặc trong khoảng nào đó (có 2 textbox)

Các bác giúp em với! Em nghĩ đây cũng là vấn đề nhiều người quan tâm!
 
Đào Việt Cường đã viết:
Dear Mr???
-----------
Anh khai báo một biết strConnectString As String rồi gán vào Connection, làm như thế anh sẽ Debug được A và B có thực sự có giá trị (valid path) hay không.

Cậu làm giúp luôn đi, mình đâu biết về VBA đâu.
Cảm ơn nhiều.
 
Dear all,
--------
Em có đoạn code này chuyên dùng để kết xuất in sổ. Nó chạy thì rất tốt, không va vấp gì, tuy nhiên em gặp phải vấn đề là nếu CSDL khá lớn thì quá Refesh chậm chạp, phải mất nhiều giây dữ liệu mới Update được. Trong khi đó Excel vẫn cứ thực hiện các lệnh bên dưới dẫn đến việc copy dữ liệu không còn chính xác nữa...:=\+ .
Làm sao để bắt chương trình Refresh xong thì mới thực hiện lệnh copy bên dưới?
Em vẫn chưa có giải pháp gì, nhân tiện nhờ anh chị giải quyết. Sau đây là code của em và file minh hoạ kèm theo. Vì file Data.xls đã được rút gọn nên quá trình Refresh rất nhanh chúng ta không nhận thấy lỗi như đã đề cập. Để test lỗi này, hãy bổ sung dữ liệu vào Data.xls vài 10.0000 rồi bổ sung lệnh copy bên dưới dòng lệnh Table_Query.REFRESH xem sao.


Mã:
Option Explicit
Function Table_Query(strTableName As String, _
                        shDestinationSheet As Worksheet, _
           Optional strDestinationRange As String = "A1", _
           Optional strProvider As String = "ODBC", _
           Optional strDataSource As String, _
           Optional strSQL As String, _
           Optional strUserID As String, _
           Optional strPassword As String) As Object
[COLOR=darkgreen]' [B]CÁC THAM SỐ:[/B][/COLOR]
[COLOR=darkgreen]'-  [B]strTableName As String[/B]: chuỗi biểu diễn Name nguồn cơ sở dữ liệu, chúng ta nên đặt một Name trong[/COLOR]
[COLOR=darkgreen]'        Database để tiện quản lý và truy xuất dữ liệu[/COLOR]
[COLOR=darkgreen]'       (Mở file Data.xls để xem Name này)[/COLOR]
[COLOR=darkgreen]'-  [B]shDestinationSheet As Worksheet[/B]: Bảng tính đích, chỉ ra rằng dữ liệu kết xuất sẽ được đổ xuống đó.[/COLOR]
[COLOR=darkgreen]'-  [B]strDestinationRange As Range[/B]: Ô bắt đầu để dữ liệu được đưa xuống từ đó[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strProvider As String = "ODBC"[/B]: Cơ sở dữ liệu được kết xuất bởi "Nhà Cung cấp" nào, mặc định là ODBC[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strDataSource As String[/B]: Cái mà Mr OkeBiladen đang thắc mắc, để có đường dẫn thay đổi theo thư mục của file [/COLOR]
[COLOR=darkgreen]'        [/COLOR][COLOR=darkgreen]chứa module này[/COLOR]
[COLOR=darkgreen]'        sử dụng thuộc tính [B]Path [/B]của ThisWorkbook (xem ví dụ bên dưới)[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strSQL As String[/B]: Chuỗi SQL[/COLOR]
[COLOR=darkgreen]'-  [B]Optional strUserID As String[/B]: (Optional)[/COLOR]
[COLOR=darkgreen]'   [B]Optional strPassword As String[/B]: (Optional)[/COLOR]
If strUserID = "" Then strUserID = "ADMIN"
If strDataSource = "" Then strDataSource = ThisWorkbook.Path & "\" & ThisWorkbook.NAME
Dim strConnection As String
[COLOR=darkgreen]'Neu su dung trinh ket noi ODBC, Table_Queryle se duoc cung cap CommanText la mot SQL[/COLOR]
If strProvider = "ODBC" Then
    strConnection = "ODBC;DBQ=" & strDataSource
    strConnection = strConnection & ";Driver={Microsoft Excel Driver (*.xls)}"
Else
    strConnection = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;"
    strConnection = strConnection & "Password=" & strPassword & ";"
    strConnection = strConnection & "User ID=" & strUserID & ";"
    strConnection = strConnection & "Data Source=" & strDataSource
    Table_Query.CommandType = xlCmdTable & "$"
    Table_Query.AdjustColumnWidth = False
End If
[COLOR=darkgreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
    shDestinationSheet.QueryTables(1).Delete
End If
On Error GoTo TRY [COLOR=darkgreen]' Cố gắng thử lại, có thể shDestinationSheet chưa  được [/COLOR][COLOR=darkgreen]Activate (mã lỗi: -2147024809)[/COLOR]
REFRESH_NOW:
Set Table_Query = shDestinationSheet.QueryTables.Add(strConnection, shDestinationSheet.Range(strDestinationRange))
Table_Query.NAME = strTableName
Application.DisplayAlerts = False
Table_Query.RefreshStyle = xlOverwriteCells
Table_Query.SourceDataFile = strDataSource
Table_Query.CommandText = IIf(strProvider = "ODBC", strSQL, strTableName & "$")
Table_Query.REFRESH
Application.DisplayAlerts = True
Exit Function
TRY:
Select Case ERR.Number
Case -2147024809
    shDestinationSheet.Activate
    GoTo REFRESH_NOW
Case Else [COLOR=darkgreen]' Không được rồi, xem lại chuỗi kết nối đã chuẩn chưa:[/COLOR]
    MsgBox ERR.Number & "-" & ERR.Description & ":" & vbNewLine & _
    "Connect string:" & vbNewLine & strConnection & vbNewLine & _
    "SQL string:" & vbNewLine & strSQL
End Select
End Function
 
[COLOR=silver]'________________________________[/COLOR]
Private Sub CommandButton1_Click()
Table_Query "NHATKY", TEMP, "A1", "ODBC", [B]ThisWorkbook[/B].[B]Path[/B] & _
"\Data.xls", "Select * From `DATA$` "
End Sub
 

File đính kèm

  • MrOKeBiladen.zip
    33.3 KB · Đọc: 378
Lần chỉnh sửa cuối:
' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:

Mr Okebab đã viết:
Mã:
 [COLOR=DarkGreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
       shDestinationSheet.QueryTables(1).Delete
End If

Dear Mr,
--------
Chứng tỏ anh chưa thử code của em, đoạn chương trình trên kiểm tra xem nếu Sheet TEMP đã có bảng truy vấn rồi thì xóa đi để tiến hành QueryTables.Add lại (với quan điểm thiết kế: chỉ sử dụng 1 QueryTable trên một Sheet cho dễ quản lý).
 
Thiết lập đường dẫn cho file Database

Theo tôi thì việc dùng file *.ini (hoặc file *.txt) để lưu trữ đường dẫn là tốt nhất.
Việc lưu trữ đường dẫn chỉ là một phần trong file *.ini.

Mỗi khi mở Workbook lên thì sẽ đọc các thông tin này vào để giải quyết các vấn đề như: Setting, các đường dẫn file cần thao tác,....
Mã:
;-------------------------------------------
; DO NOT EDIT THIS FILE BY HAND !
; -------------------------------------------
[OPTIONS]
Username=
DateFormat=
ProcedureHeaderBelowDeclaration=0
Language=2
XSLFileName=sample.xsl
OpenXMLFileAfterCreation=2
MaxNumberOfCharactersPerLine=80
UseUniqueLineNumbersInProject=0
KeepActiveWindowOpenWhenClosingWindows=0
LineNumberIncrement=10

[TOOLBAR_BUTTONS_VISIBILITY]
ButtonCopyControlWithCodeVisible=1
ButtonPasteControlWithCodeVisible=1
ButtonFindVisible=1
ButtonProcedureCallersVisible=1
ButtonAddProcedureVisible=1
ButtonAddCodeTemplateVisible=1
ButtonAddModuleHeaderVisible=1
ButtonAddProcedureHeaderVisible=1
ButtonAddErrorHandlerVisible=1
ButtonAddProcedureHeaderAndErrorHandlerVisible=1
ButtonAddLineNumberVisible=1
ButtonRemoveLineNumberVisible=1
ButtonSplitLinesVisible=1
ButtonCombineLinesVisible=1
ButtonAddProcedureToFavoritesVisible=1
ButtonGoToFavoriteProcedureVisible=1
ButtonSelectCaseAssistantVisible=1
ButtonClearImmediateWindowVisible=1
ButtonCloseWindowsVisible=1
ButtonCollapseProjectsVisible=1
ButtonOptionsVisible=1

[SUFFIX]
ResultVariableSuffix=Result
Trên đây là một ví dụ về việc dùng file*.ini để lưu dữ liệu của MZToolvba

Lê Văn Duyệt
 
Đào Việt Cường đã viết:
Mã:
 [COLOR=DarkGreen]' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:[/COLOR]
If shDestinationSheet.QueryTables.Count > 0 Then
       shDestinationSheet.QueryTables(1).Delete
End If
Dear Mr,
--------
Chứng tỏ anh chưa thử code của em, đoạn chương trình trên kiểm tra xem nếu Sheet TEMP đã có bảng truy vấn rồi thì xóa đi để tiến hành QueryTables.Add lại (với quan điểm thiết kế: chỉ sử dụng 1 QueryTable trên một Sheet cho dễ quản lý).

Oan cho mình quá, mình đang xem xét rất kỹ nhưng lại hiểu rất ít (do trình độ) vì xưa nay mình quen làm VBA dựa vào Macro rồi, vì thế quen đọc VBA theo ngôn ngữ macro. Nếu mà cái code của cậu viết theo macro (như ví dụ mình đưa ra) thì sẽ hiểu được. Đằng này nó lại khác nên hơi khó hiểu. Tuy nhiên mình vẫn đang áp dụng nó đấy. Cảm ơn cậu nhiều.

Xóa name : Cách xóa name thì hay rồi, nhưng mình không hiểu tại sao đã bỏ dòng .Name = "Query from DanhMuc"
thế mà nó vẫn tạo ra name. Không có cách cho nó không tạo ra sao ?
 
Mr Okebab đã viết:
xưa nay mình quen làm VBA dựa vào Macro rồi, vì thế quen đọc VBA theo ngôn ngữ macro. Nếu mà cái code của cậu viết theo macro (như ví dụ mình đưa ra) thì sẽ hiểu được. Đằng này nó lại khác nên hơi khó hiểu. Tuy nhiên mình vẫn đang áp dụng nó đấy.

Dear Mr,
--------
Cũng không thể nói VBA và Macro có sự khác biệt đến vậy, nói đúng hơn khi chúng ta dùng Macro để giải quyết một vấn đề thì chúng ta mượn ngôn ngữ của "nó" để diễn đạt cho "nó" hiểu và làm theo ý chúng ta mà thôi.
Đoạn code trên: em muốn Macro thi hành và tạo ra một Table Query (kiểu Object) dựa vào các tham số mà em truyền vào. Chắc có lẽ hàm có nhiều tham số nên anh bị rối? Thực ra chỉ có 2 tham số là bắt buộc strTableNameshDestinationSheet, các tham số khác là tuỳ ý.
Chắc những kiến thức về VBA Funtions không quá xa lạ với anh. Vấn đề là:
Mr Okebab đã viết:
Xóa name : Cách xóa name thì hay rồi, nhưng mình không hiểu tại sao đã bỏ dòng .Name = "Query from DanhMuc"
thế mà nó vẫn tạo ra name.
Trong thủ tục, chúng ta yêu cầu Macro thực hiện thêm mới TableQuery thông qua phương thức Add. Việc tạo ra một name khác chứng tỏ Macro vẫn rất ngoan ngoãn vâng lời. Mỗi lần thủ tục kết thúc đương nhiên sẽ có một TableQuery phát sinh (ra đời). Và quy tắc là nếu Table đó đã được đặt tên trùng với tên mà ta chỉ định thì Macro tự động đặt tên cho Table đó theo chỉ số. Để hạn chế việc này thì cần kiểm tra xem trên Sheet được chỉ định đổ dữ liệu xuống đã tồn tại TableQuery nào chưa, nếu đã có thì xoá đi. Theo em đây là cách ngắn nhất để tiết kiệm việc tính toán và khỏi phải xác định Name đó là gì.
Mr Okebab đã viết:
Không có cách cho nó không tạo ra sao ?
Dĩ nhiên là có, nếu như anh không sử dụng phương thức Add nhằm tạo ra TableQuery mới toanh. Theo cách này anh chỉ cần truyền tham số strSQL cho TableQrery đã có rồi Refresh lại (việc kết nối và tạo ra một TableQuery được thực hiện ở một thủ tục khác).
 
Xin bổ xung các connection string từ http://www.connectionstring.com đã được đóng gói để các bạn tham khảo offline.

Lê Văn Duyệt
 

File đính kèm

  • ConnectionString.rar
    362.8 KB · Đọc: 661
Bạn nào biết chỉ giúp!!!
Trên diễn đàn mình có down load về 1 tập tin nén. Khi mở ra nó có dạng .frm (hình như của anh Lê Văn Duyệt đưa lên thì phải). Làm thế nào mình xem được file dạng form .frm?

--=0
Mã:
[B][COLOR="Navy"]From Sa_DQ:[/COLOR][/B]
 Hãy thử nhắn tin trực tiếp cho Anh Lê Văn Duyệt xem sao!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT
Back
Top Bottom