Cho hỏi truy vấn dữ liệu trên 2 máy trong mạng nội bộ

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
-Chào các ACE trên diễn đàn. Mình tham gia diễn đàn và học tập cũng rất nhièu từ diễn đàn. Nhưng có một vấn đề mà tìm mãi và tới giờ vẫn chưa trả lời được.
-Mình muốn hỏi thế này:
--------------------Mình có 2 máy nội bộ kết nối với nhau, trên mỗi máy có 1 file excel
giả sử là : filelamviec.xlsm và dataxuly.xlsm.
--------------------Mình có thể dùng ADO để trên filelamviec.xlsm cập nhật dữ liệu từ filelamviec.xlsm cho dataxuly.xlsm trên máy kia không? ( dataxuly.xlsm không mở)
--------------------Nếu được phải thiết lập như thế nào có thể cho code làm ví dụ càng tốt.
xin lỗi vì không biết đưa file ví dụ lên như thế nào cả. Vấn đề này không tìm được ở đâu cả nên CAO THỦ ĐI QUA DỪNG CHÂN GIÚP ĐỠ!!!!!!
 
-Chào các ACE trên diễn đàn. Mình tham gia diễn đàn và học tập cũng rất nhièu từ diễn đàn. Nhưng có một vấn đề mà tìm mãi và tới giờ vẫn chưa trả lời được.
-Mình muốn hỏi thế này:
--------------------Mình có 2 máy nội bộ kết nối với nhau, trên mỗi máy có 1 file excel
giả sử là : filelamviec.xlsm và dataxuly.xlsm.
--------------------Mình có thể dùng ADO để trên filelamviec.xlsm cập nhật dữ liệu từ filelamviec.xlsm cho dataxuly.xlsm trên máy kia không? ( dataxuly.xlsm không mở)
--------------------Nếu được phải thiết lập như thế nào có thể cho code làm ví dụ càng tốt.
xin lỗi vì không biết đưa file ví dụ lên như thế nào cả. Vấn đề này không tìm được ở đâu cả nên CAO THỦ ĐI QUA DỪNG CHÂN GIÚP ĐỠ!!!!!!
Cơ bản là thế này. Thay chỗ FileNamePath cho đúng đường dẫn đến tên file
PHP:
Sub ADO()
    Dim CON As Object, REC As Object
    Dim FileNamePath As String, StrRequest As String
    Set CON = CreateObject("ADODB.Connection")
    Set REC = CreateObject("ADODB.Recordset")
    FileNamePath = ThisWorkbook.FullName

    With CON
        If Application.Version < 12 Then
             .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileNamePath & ";Extended Properties=""Excel 8.0;HDR=YES;"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileNamePath & ";Extended Properties=""Excel 12.0;HDR=YES;"";"
        End If
        .Open
    End With
'Lay tat ca du lieu tu sheet Source và gán vào sheet Target tai A3
StrRequest = "SELECT * FROM [Source$]"
REC.Open StrRequest, CON
Sheets("Target").Range("A3").CopyFromRecordset REC

REC.Close: CON.Close
Set CON = Nothing: Set REC = Nothing
End Sub
 
Cơ bản là thế này. Thay chỗ FileNamePath cho đúng đường dẫn đến tên file
PHP:
Sub ADO()
    Dim CON As Object, REC As Object
    Dim FileNamePath As String, StrRequest As String
    Set CON = CreateObject("ADODB.Connection")
    Set REC = CreateObject("ADODB.Recordset")
    FileNamePath = ThisWorkbook.FullName

    With CON
        If Application.Version < 12 Then
             .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileNamePath & ";Extended Properties=""Excel 8.0;HDR=YES;"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileNamePath & ";Extended Properties=""Excel 12.0;HDR=YES;"";"
        End If
        .Open
    End With
'Lay tat ca du lieu tu sheet Source và gán vào sheet Target tai A3
StrRequest = "SELECT * FROM [Source$]"
REC.Open StrRequest, CON
Sheets("Target").Range("A3").CopyFromRecordset REC

REC.Close: CON.Close
Set CON = Nothing: Set REC = Nothing
End Sub
Cảm ơn bạn dừng chân giúp đỡ. Vì ở nhà không có 2 máy để thử nên mình cụ thể thế này nhé:
Ví dụ file excel dataxuly.xlsm có địa chỉ trên máy kia là : d:\dataxuly.xlsm và tên máy là TEST thì code thành thế này đúng không vậy?
Mã:
[COLOR=#000000][COLOR=#0000BB]Sub ADO[/COLOR][COLOR=#007700]()
    [/COLOR][COLOR=#0000BB]Dim CON [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]REC [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object
    Dim FileNamePath [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]StrRequest [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String
    Set CON [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CreateObject[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"ADODB.Connection"[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]Set REC [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CreateObject[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"ADODB.Recordset"[/COLOR][COLOR=#007700])
   [/COLOR][/COLOR][COLOR=#008000] [/COLOR][COLOR=#800080]FileNamePath = TEST\\D:\dataxuly.xlsm ' CHÚ Ý CHÚ Ý[/COLOR][COLOR=#000000][COLOR=#0000BB]

    With CON
        [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Version [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]12 Then
             [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]ConnectionString [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]FileNamePath [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]";Extended Properties=""Excel 8.0;HDR=YES;"";"
        [/COLOR][COLOR=#007700]Else
            .[/COLOR][COLOR=#0000BB]ConnectionString [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]FileNamePath [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]";Extended Properties=""Excel 12.0;HDR=YES;"";"
        [/COLOR][COLOR=#0000BB]End [/COLOR][COLOR=#007700]If
        .[/COLOR][COLOR=#0000BB]Open
    End With
[/COLOR][COLOR=#DD0000]'Lay tat ca du lieu tu sheet Source và gán vào sheet Target tai A3
StrRequest = "SELECT * FROM [Source$]"
REC.Open StrRequest, CON
Sheets("Target").Range("A3").CopyFromRecordset REC

REC.Close: CON.Close
Set CON = Nothing: Set REC = Nothing
End Sub  [/COLOR][/COLOR]
 
Cảm ơn bạn dừng chân giúp đỡ. Vì ở nhà không có 2 máy để thử nên mình cụ thể thế này nhé:
Ví dụ file excel dataxuly.xlsm có địa chỉ trên máy kia là : d:\dataxuly.xlsm và tên máy là TEST thì code thành thế này đúng không vậy?
Mã:
[COLOR=#000000][COLOR=#0000BB]Sub ADO[/COLOR][COLOR=#007700]()
    [/COLOR][COLOR=#0000BB]Dim CON [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]REC [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object
    Dim FileNamePath [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]StrRequest [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String
    Set CON [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CreateObject[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"ADODB.Connection"[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]Set REC [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CreateObject[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"ADODB.Recordset"[/COLOR][COLOR=#007700])
   [/COLOR][/COLOR][COLOR=#800080]FileNamePath = TEST\\D:\dataxuly.xlsm ' CHÚ Ý CHÚ Ý[/COLOR][COLOR=#000000][COLOR=#0000BB]

    With CON
        [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Version [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]12 Then
             [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]ConnectionString [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]FileNamePath [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]";Extended Properties=""Excel 8.0;HDR=YES;"";"
        [/COLOR][COLOR=#007700]Else
            .[/COLOR][COLOR=#0000BB]ConnectionString [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]FileNamePath [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]";Extended Properties=""Excel 12.0;HDR=YES;"";"
        [/COLOR][COLOR=#0000BB]End [/COLOR][COLOR=#007700]If
        .[/COLOR][COLOR=#0000BB]Open
    End With
[/COLOR][COLOR=#DD0000]'Lay tat ca du lieu tu sheet Source và gán vào sheet Target tai A3
StrRequest = "SELECT * FROM [Source$]"
REC.Open StrRequest, CON
Sheets("Target").Range("A3").CopyFromRecordset REC

REC.Close: CON.Close
Set CON = Nothing: Set REC = Nothing
End Sub  [/COLOR][/COLOR]

Cơ bản của 1 chuỗi là phải nằm trong 2 cái dấu nháy: FileNamePath = "\\TEST\D:\dataxuly.xlsm "
 
Lần chỉnh sửa cuối:
- Bạn có thể xem thêm cách truy vấn qua Excel Chat, link tại chữ ký của tôi.

@Anh Hải: Anh đã quá giang sang ADO rồi đấy ^^.
 
- Bạn có thể xem thêm cách truy vấn qua Excel Chat, link tại chữ ký của tôi.

@Anh Hải: Anh đã quá giang sang ADO rồi đấy ^^.

Theo mình thì ADO có thế mạnh là xử lý file đóng hoặc không cần quan tâm đến nó đang đóng hay mở, chứ nếu nói về thuật toán mình vẫn khoái VBA hơn. Nói chung tại dốt ADO quá nên bào chữa chút vậy
 
Theo mình thì ADO có thế mạnh là xử lý file đóng hoặc không cần quan tâm đến nó đang đóng hay mở, chứ nếu nói về thuật toán mình vẫn khoái VBA hơn. Nói chung tại dốt ADO quá nên bào chữa chút vậy

VBA và ADO khác nhau hoàn toàn đó bạn à. ADO chỉ là một component thực thi ngôn ngữ truy vấn SELECT hay DELETE, INSERT, UPDATE,... dữ liệu (ngôn ngữ SQL). Trong VBE cũng dùng nhiều component hay ActiveX Control: Label, ComboBox, TextBox. Mỗi component đóng vai trò cũng như nhiệm vụ khác nhau. VBA/VBE là môi trường lập trình mà ngôn ngữ là Visual Basic (VB) cho phép viết lệnh điều khiển các thành phần của ứng dụng (Application), các component. Vậy giữa VBA và ADO không thể so sánh với nhau! Với bài toán trích lọc dữ liệu thì ngôn ngữ SQL là số 1 về sự linh hoạt, tốc độ.

Ví dụ nhỏ để minh chứng sức mạnh của SQL. Lập danh sách tính tổng giá trị nhóm theo từng khách hàng của mặt hàng "HH001", ngày > 01/01/2013.

Câu lệnh SQL đơn giản là thế này:

Mã:
cnn.Open(FileData)
Recordset.Open("SELECT MAKH, SUM(TTIEN) FROM PHIEUXUAT WHERE MAHH='HH001' AND NGAY>#01/01/2013# GROUP BY MAKH", cnn)
Range("A1").CopyFromRecordset(Recordset)

Tiện thể mình nói thêm về file Excel. Tại một thời điểm chỉ một Connection mở file Excel mà thôi. Tức là nếu có ít nhất 2 máy cùng mở file Excel này là lỗi. Nên dùng ADO và file Excel sẽ không phải là giải pháp chạy mạng với nhiều người dùng.
 
Lần chỉnh sửa cuối:
VBA và ADO khác nhau hoàn toàn đó bạn à. ADO chỉ là một component thực thi ngôn ngữ truy vấn SELECT hay DELETE, INSERT, UPDATE,... dữ liệu (ngữ SQL). Trong VBE cũng dùng nhiều component hay ActiveX Control: Label, ComboBox, TextBox. Mỗi component đóng vai trò cũng như nhiệm vụ khác nhau. VBA/VBE là môi trường lập trình mà ngôn ngữ là Visual Basic (VB) cho phép viết lệnh điều khiển các thành phần của ứng dụng (Application), các component. Vậy giữa VBA và ADO không thể so sánh với nhau! Với bài toán trích lọc dữ liệu thì ngôn ngữ SQL là số 1 về sự linh hoạt, tốc độ.

Ví dụ nhỏ để minh chứng sức mạnh của SQL. Lập danh sách tính tổng giá trị nhóm theo từng khách hàng của mặt hàng "HH001", ngày > 01/01/2013.

Câu lệnh SQL đơn giản là thế này:

Mã:
cnn.Open(FileData)
Recordset.Open("SELECT MAKH, SUM(TTIEN) FROM PHIEUXUAT WHERE MAHH='HH001' AND NGAY>#01/01/2013# GROUP BY MAKH", cnn)
Range("A1").CopyFromRecordset(Recordset)

Tiện thể mình nói thêm về file Excel. Tại một thời điểm chỉ một Connection mở file Excel mà thôi. Tức là nếu có ít nhất 2 máy cùng mở file Excel này là lỗi. Nên dùng ADO và file Excel sẽ không phải là giải pháp chạy mạng với nhiều người dùng.
Nói thiệt đọc bài giảng của anh cũng như vịt nghe sấm vậy đó vì mình có tí cơ bản nào đâu. Toàn là học lởm của anh chị trên diễn đàn. Nay viết được vài yêu cầu nhỏ cũng coi như đã tự sướng rồi.
 
Nói thiệt đọc bài giảng của anh cũng như vịt nghe sấm vậy đó vì mình có tí cơ bản nào đâu. Toàn là học lởm của anh chị trên diễn đàn. Nay viết được vài yêu cầu nhỏ cũng coi như đã tự sướng rồi.

Bài viết bên trên mình muốn cung cấp thông về vai trò ADO và đặc tính của file Excel thôi chứ chưa có giảng gì cả :) Nếu bạn chịu học thì trước sau sẽ hiểu rõ vấn đề thôi mà. Nếu bạn muốn hiểu nhiều hơn về VBA và ADO thì nên tìm tài liệu trên mạng nhiều vô cùng. Diễn đàn chỉ là nơi giải đáp hay hướng dẫn một tình huống cụ thể nào đó thôi, chứ học e rằng rất lâu mới thành công.
 
Đọc câu đỏ đỏ rồi thì học sau nổi nữa hả anh? Anh Tuân nói vậy thì chạy thôi anh em ơi.

Mình tham gia trên Webketoan từ năm 2004 khi đó số người biết VBA ở VN rất hiếm (theo quan sát từ diễn đàn này), những người yêu mến Excel và VBA hiếm hoi này từ "ExcelFan club" bên Wkt tách ra thành lập GPE (06/2006). Từ ngày đầu GPE số người biế VBA cũng hiếm hoi lắm. Bạn tìm các bài viết về VBA giai đoạn 2006-2007 sẽ biết nhiều không và chủ yếu nick name nào viết? Ngày nay đã có tương đối nhiều người biết tới VBA và vận dụng được cho công việc của mình phần nào. Nhưng nếu ai đó nói về học thuật hay phải mất tới 7 năm để có cái cơ bản của VBA thì với mình như thế là lâu quá rồi. Nói thực mình cũng phải vừa mò mừa đọc sách nên cũng mất khá nhiều time. Nếu có người chỉ dẫn con đường và phương pháp học ban đầu thì có lẽ thành công sớm hơn nhiều về VBA.
 
Lần chỉnh sửa cuối:
Tiện thể mình nói thêm về file Excel. Tại một thời điểm chỉ một Connection mở file Excel mà thôi. Tức là nếu có ít nhất 2 máy cùng mở file Excel này là lỗi. Nên dùng ADO và file Excel sẽ không phải là giải pháp chạy mạng với nhiều người dùng.
Nói như anh Nguyễn Duy Tuân thì yêu cầu của mình là 2 máy thôi thì ADO sẽ giải quyết được đúng không vậy? Nhưng với câu lệch sau mình không thể kết nối được không biết vì sao luôn báo lỗi tại dòng bôi đỏ " Mình hiểu là không kết nối được" Anh Tuân có thể cho biết vì sao không ah
Mã:
Sub kn()
Dim cn As Object
Dim rs As Object
Dim spath As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
spath = "\\Gacon\d:\data.xlsm"
                    [COLOR=#ff0000] 'Workbooks.Open (spath)   thử cả cách này cũng không được[/COLOR]
With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source= " & spath & "; Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
        .CursorLocation = 3
        [COLOR=#ff0000].Open[/COLOR]
        rs.Open "SELECT * FROM [sheet1$]", cn, 3, 3
       Sheet6.Range("A1").CopyFromRecordset rs
    cn.Close
End With
End Sub
 

File đính kèm

  • UntitledADO.jpg
    UntitledADO.jpg
    17.1 KB · Đọc: 10
  • Untitledhhh.jpg
    Untitledhhh.jpg
    12.8 KB · Đọc: 9
Lần chỉnh sửa cuối:
- Bạn có thể xem thêm cách truy vấn qua Excel Chat, link tại chữ ký của tôi.

@Anh Hải: Anh đã quá giang sang ADO rồi đấy ^^.

Hôm nay mới đọc được bài của bạn. Vậy chứng tỏ là có thể liên kết ADO qua 2 máy lan đúng không bạn? nhưng cho mình hỏi 2 dạng code sau khi nào dùng nó vậy
Mã:
 With adoConn 
             .ConnectionString  = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                    & "Data Source=" & FileTarget _
                    & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"  
          .Open
      End With
và dạng
Mã:
 With cn 
         .Provider  = "Microsoft.ACE.OLEDB.12.0"
         .ConnectionString  = "Data Source= " & spath & "; Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
           .CursorLocation  = 3
          .Open
        rs.Open "SELECT * FROM [sheet1$]", cn, 3, 3
       Sheet6.Range("A1").CopyFromRecordset rs
    cn.Close
  End With
mình hôm nay viết bài này nhưng chưa thử mình hay dùng dạng 2 vậy 2 dạng này có khác nhau không vây?
 
Tại một thời điểm chỉ có một connection kết nối tới file Excel thôi nhé, muốn máy thứ hai Open hoặc connect thì máy 1 phải Close nó lại. Bạn tìm tất cả trên mạng sẽ không có giải pháp nào đâu nếu không dùng các ứng dụng hõi trợ khác.
 
Tại một thời điểm chỉ có một connection kết nối tới file Excel thôi nhé, muốn máy thứ hai Open hoặc connect thì máy 1 phải Close nó lại. Bạn tìm tất cả trên mạng sẽ không có giải pháp nào đâu nếu không dùng các ứng dụng hõi trợ khác.
Anh tuân ơi em đã thử được kết nối 2 máy lan bằng ADO nhưng forder chứa file liên kết tới phải share. tất nhiên để máy khác không vào forder đó thì đã đặt pass đăng nhập window và máy cần kết nối phải biết pass để mở liên kết. Cho em hỏi code tự mỏ pass khi liên kết như thế được không ạ?
 
............................................
mình hôm nay viết bài này nhưng chưa thử mình hay dùng dạng 2 vậy 2 dạng này có khác nhau không vây?

Không biết bạn lấy code ở đâu nhưng mình có thể giả thích như sau:

+/ Dạng 1: bạn sử dụng cho Excel 2003
+/ Dạng 2: bạn sử dụng cho Excel 2007 trở lên
 
Web KT
Back
Top Bottom