Tìm kiếm và lấy dữ liệu ở file không mở? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Dear all,
Tôi đang muốn lấy dữ liệu vào các vùng có dấu hỏi chấm vào trong file có tên : LayDuLieu
Câu hỏi cụ thể cũng đã nằm trong file kèm này.
và nguồn dữ liệu để lấy nằm trong file có tên: Data
đk:2 file này cùng nằm chung trong 1 thư mục

Rất mong nhận được sự giúp đỡ của các bạn,
Thanks you very much
 

File đính kèm

Ôi,Tôi xin lỗi,..


Tôi xin lỗi bạn rất nhiều , tôi không nghĩ đã khiến cho bạn giận như vậy. Nếu biết bạn giận thế này tôi cũng không dám đòi hỏi thêm gì cả,
Sở dĩ tôi thấy kết quả đã được như ý nhưng tôi nghĩ nếu mình bấm cảm ơn các bạn mà không nói một lời gì nữa thì thấy rất áy láy...
Các bạn đã cố gắng dành thời gian để giúp tôi vì vậy tôi cũng nên thông tin đầy đủ đến cho các bạn biết tình hình mục đích là: 1 phần để các các bạn biết tôi có quan tâm đến vấn đề đó hay không? và tôi quan tâm nó đến mức nào. Mặt khác tôi thông tin lại hi vọng là để có thêm những góp ý khác,, không những cho tôi mà có thể nhiều bạn khác cũng quan tâm đến.


Thật sự tôi rất muốn đưa những cái thực tế nhất lên để được mọi người hỗ trợ đỡ mất thời gian cho tôi nhưng vì tài liệu nội bộ của cơ quan đã có qui định dù quan trọng hay không quan trọng cũng không được mang ra ngoài, thậm chí tôi muốn copy về nhà để làm việc cũng không được chứ không nói là đưa lên mạng.. rất mong bạn và mọi người thổng cảm về điều này.


Vi không hiểu gì về lập trình và để trả giá cho việc tôi không đưa file thật lên được tôi đã phải loay hoay cả buổi sáng như vậy.
Tôi xin lỗi đã khiến cho bạn buồn,tôi cảm ơn bạn rất nhiều, thật sự sau khi tham gia diễn đàn này tôi cảm thấy có phần may mắn vì đã biết đến diễn đàn và thấy có rất nhiều điều muốn hỏi và có những vấn đề không biết hỏi từ đâu hỏi như thế nào nữa ...quan trọng nhất đối với tôi lúc này là tôi rất cần những người có kiến thức như các bạn trợ giúp !
...
Xin lỗi bạn nhiều nhé,

file excel bị đặt Password Open FIle thì làm sao mà lấy được nội dung , trừ khi bạn là hacker . Bill mà cho phép điều này chắc giờ thế giới chả ai dám xài Excel
 
Upvote 0
file excel bị đặt Password Open FIle thì làm sao mà lấy được nội dung , trừ khi bạn là hacker . Bill mà cho phép điều này chắc giờ thế giới chả ai dám xài Excel

Cảm ơn bạn đã quan tâm, về vấn đề pass open file thôi coi như là không có nữa vậy bạn ah.
Tôi sẽ chấp nhận bỏ nó miễn sao công việc đỡ vất vả.
Ngoài ra nếu biết passopen rồi mình có thể viết luôn vào code được không bạn , ví dụ pass file open là : 123 chẳng hạn
Thôi các bạn giúp được cho tôi trường hợp không có pass , với tôi là đủ lắm rồi..
nếu có thêm trường hợp tự điền pass nữa thì sẽ đỡ hơn nhưng không sao.
Tôi không hiểu gì nên đôi lúc hỏi có thể sẽ khiến các bạn đọc cảm thấy khó chịu, mong các bạn thông cảm được phần nào ..
XIn cảm ơn rất nhiều.
 
Upvote 0
Mã:
Option Explicit
Sub GPE()
Dim CoN As Object, Data As Object, fName As String
fName = ThisWorkbook.Path & "\" & "Data.xls"
Application.ScreenUpdating = False
Set CoN = CreateObject("adodb.connection")
        CoN.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
        fName & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
        Set Data = CoN.Execute("select * from [Sheet1$C2:F] where f1 is not null")
            If Not Data.EOF Then Worksheets("Sheet1").Range("M9").CopyFromRecordset Data
        Data.Close
        CoN.Close
With Sheet1
    .Range("G9:K" & .[F65000].End(3).Row).Value = "=SUMIFS(R9C15:R1000C15,R9C13:R1000C13,RC6,R9C14:R1000C14,R7C)"
    .Range("G9:K" & .[F65000].End(3).Row).Value = .Range("G9:K" & .[F65000].End(3).Row).Value
    .Range("M9:P65000").ClearContents
End With
Application.ScreenUpdating = True
End Sub
nếu bài này bố trí theo kiểu dọc thì khỏi cần đưa dữ liệu ra vùng trung gian làm gì cho mệt, sử dụng các câu lệnh group by thì nó ra tuốt tuồn tuộc
vì tôi làm kỵ làm việc với ADO mà tiêu đề có chữ tiếng việt, nên trong file data tôi có chỉnh lại 1 số thông số, và trong file kết quả tôi bố trí lại theo kiểu dọc( chú ý code này tôi viết theo kiểu có thể lấy dữ liệu trên nhiều file)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
nếu bài này bố trí theo kiểu dọc thì khỏi cần đưa dữ liệu ra vùng trung gian làm gì cho mệt, sử dụng các câu lệnh group by thì nó ra tuốt tuồn tuộc
vì tôi làm kỵ làm việc với ADO mà tiêu đề có chữ tiếng việt, nên trong file data tôi có chỉnh lại 1 số thông số, và trong file kết quả tôi bố trí lại theo kiểu dọc( chú ý code này tôi viết theo kiểu có thể lấy dữ liệu trên nhiều file)
haiz , bố trí dữ liệu kiểu gì là Quyền của người dùng , trừ khi người dùng bố trí quá phản khoa học , ở đây tôi thấy bố trí như file LayDuLieu như ban đầu chả có gì gọi là phản khoa học cả
Chuyện tên Cột có xài được tiếng Việt có dấu hay không ta bàn sau
Bây giờ tôi mời anh vào đây giao lưu : làm sao bố trí file LayDuLieu và Data y như ban đầu và trong 1 lần truy vấn duy nhất mà chỉ cần .CopyFromRecordset là ra luôn nội dung vùng G9:K14 mà tác giả đã làm sẵn bằng SUMIFS ?
 
Upvote 0
haiz , bố trí dữ liệu kiểu gì là Quyền của người dùng , trừ khi người dùng bố trí quá phản khoa học , ở đây tôi thấy bố trí như file LayDuLieu như ban đầu chả có gì gọi là phản khoa học cả
Chuyện tên Cột có xài được tiếng Việt có dấu hay không ta bàn sau
Bây giờ tôi mời anh vào đây giao lưu : làm sao bố trí file LayDuLieu và Data y như ban đầu và trong 1 lần truy vấn duy nhất mà chỉ cần .CopyFromRecordset là ra luôn nội dung vùng G9:K14 mà tác giả đã làm sẵn bằng SUMIFS ?
Không biết trong excel có dạng truy vấn như crosstab query như access không?
 
Upvote 0
Mã:
Option Explicit
Sub GPE()
Dim CoN As Object, Data As Object, fName As String
fName = ThisWorkbook.Path & "\" & "Data.xls"
Application.ScreenUpdating = False
Set CoN = CreateObject("adodb.connection")
        CoN.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
        fName & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
        [COLOR=#ff0000]Set Data = CoN.Execute("select * from [Sheet1$C2:F] where f1 is not null")[/COLOR]
            [COLOR=#800080]If Not Data.EOF Then Worksheets("Sheet1").Range("M9").CopyFromRecordset Data[/COLOR]
        Data.Close
        CoN.Close
With Sheet1
    .Range("G9:K" & .[F65000].End(3).Row).Value = "[COLOR=#0000ff]=SUMIFS(R9C15:R1000C15,R9C13:R1000C13,RC6,R9C14:R1000C14,R7C)[/COLOR]"
    .Range("G9:K" & .[F65000].End(3).Row).Value = .Range("G9:K" & .[F65000].End(3).Row).Value
    [COLOR=#800080].Range("M9:P65000").ClearContents[/COLOR]
End With
Application.ScreenUpdating = True
End Sub

Cảm ơn bạn rất nhiều, người thường xuyên mang đến điều bất ngờ cho tôi.
Code cho file thử đính kèm cho ra kết quả đã đúng với ý tôi rồi.
Tôi thấy code bài này rất giống #14 sáng nay khi tôi cũng đã đưa vào áp dụng cho file thật và bỏ cả password open file ra và loay hoay mãi vẫn chưa khắc phục được cái lỗi dòng màu đỏ,giờ nhìn code này lại thấy thêm vùng màu xanh hơi khó hiểu 1 chút ...
Tôi mong bạn đừng giận thật sự tôi chỉ muốn hiểu một chút nào đó để có thể chủ động sửa chữa được thôi. Giả sử nếu tôi có đưa được file thật lên đi nữa thì tôi sẽ không phải mất thời gian loay hoay hay làm phiền các bạn nhiều như thế này, nhưng sau này thêm dòng thêm cột hay thay đổi gì đó ... lỗi xảy ra tôi biết tìm các bạn ở đâu hay có thể kêu ai được đây.

Nếu không phiền mong bạn có thể giải thích giúp tôi những phần tôi tô màu được không ạ?
Hay bạn có thể viết giúp tôi đoạn code giống như bài #2 mà bạn đã làm được không ạ vì tôi đã áp dụng được bài này rồi bạn ah.

Hix tôi kém cỏi quá cứ nghĩ rằng mọi thứ đơn giản cứ hỏi và có bài trả lời thì sẽ nhẹ nhàng ai ngờ sau khi nhận được bài trả lời lại càng muốn hỏi thêm nhiều vấn đề liên quan khác nữa thì mới xong...nếu có chỗ nào tôi không phải mong các bạn đừng giận.

Tôi xin cảm ơn và rất trân trọng những bài viết của các bạn dành cho tôi.
 
Upvote 0
Tiếp theo cho ra lò code ADO + DIC. Không phải dùng Hàm Sumifs nữa.
Mã:
Sub GPE_()
Dim CoN As Object, Data As Object, fName As String
fName = ThisWorkbook.Path & "\" & "Data.xls"
Application.ScreenUpdating = False
Set CoN = CreateObject("adodb.connection")
    CoN.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
    fName & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    Set Data = CoN.Execute("select * from [Sheet1$C2:F] where f1 is not null")
        If Not Data.EOF Then Worksheets("Sheet1").Range("M9").CopyFromRecordset Data
    Data.Close
    CoN.Close
Dim Dic As Object, sArr, dArr, Arr, I&, J&, K&, Tem
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    sArr = Range(.[F9], .[F65000].End(3)).Value
    ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
    For I = 1 To UBound(sArr, 1)
        Tem = sArr(I, 1)
        If Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Add Tem, K
        End If
    Next I
    sArr = Range(.[M9], .[M65000].End(3)).Resize(, 4).Value
    Arr = .Range("G7:K7").Value
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Dic.Exists(Tem) Then
        For J = 1 To UBound(Arr, 2)
            If sArr(I, 2) = Arr(1, J) Then
                dArr(Dic.Item(Tem), J) = dArr(Dic.Item(Tem), J) + sArr(I, 3)
            End If
        Next J
    End If
Next I
    .Range("G9").Resize(K, 5).ClearContents
    .Range("G9").Resize(K, 5).Value = dArr
    .Range("M9:P65000").ClearContents
End With
Set Dic = Nothing
End Sub

hihi, tôi vừa trả lời xong thì đã thấy thêm bài nữa của bạn,
bài này để ngày mai tôi vận dụng thử rồi thông tin lại cho bạn sau nhé.
bạn dễ thương quá , tôi cứ tưởng bạn sẽ không quay lại nữa hihi
cảm ơn bạn nhiều lắm..

 
Upvote 0
Tiếp theo cho ra lò code ADO + DIC. Không phải dùng Hàm Sumifs nữa.
Mã:
Sub GPE_()
Dim CoN As Object, Data As Object, fName As String
fName = ThisWorkbook.Path & "\" & "Data.xls"
Application.ScreenUpdating = False
Set CoN = CreateObject("adodb.connection")
    CoN.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
    fName & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    Set Data = CoN.Execute("select * from [Sheet1$C2:F] where f1 is not null")
        If Not Data.EOF Then Worksheets("Sheet1").Range("M9").CopyFromRecordset Data
    Data.Close
    CoN.Close
Dim Dic As Object, sArr, dArr, Arr, I&, J&, K&, Tem
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    sArr = Range(.[F9], .[F65000].End(3)).Value
    ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
    For I = 1 To UBound(sArr, 1)
        Tem = sArr(I, 1)
        If Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Add Tem, K
        End If
    Next I
    sArr = Range(.[M9], .[M65000].End(3)).Resize(, 4).Value
    Arr = .Range("G7:K7").Value
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Dic.Exists(Tem) Then
        For J = 1 To UBound(Arr, 2)
            If sArr(I, 2) = Arr(1, J) Then
                dArr(Dic.Item(Tem), J) = dArr(Dic.Item(Tem), J) + sArr(I, 3)
            End If
        Next J
    End If
Next I
    .Range("G9").Resize(K, 5).ClearContents
    .Range("G9").Resize(K, 5).Value = dArr
    .Range("M9:P65000").ClearContents
End With
Set Dic = Nothing
End Sub

hihi, tôi vừa trả lời xong thì đã thấy thêm bài nữa của bạn,
bài này để ngày mai tôi vận dụng thử rồi thông tin lại cho bạn sau nhé.
bạn dễ thương quá , tôi cứ tưởng bạn sẽ không quay lại nữa hihi
cảm ơn bạn nhiều lắm..
 
Upvote 0
nếu bài này bố trí theo kiểu dọc thì khỏi cần đưa dữ liệu ra vùng trung gian làm gì cho mệt, sử dụng các câu lệnh group by thì nó ra tuốt tuồn tuộc
vì tôi làm kỵ làm việc với ADO mà tiêu đề có chữ tiếng việt, nên trong file data tôi có chỉnh lại 1 số thông số, và trong file kết quả tôi bố trí lại theo kiểu dọc( chú ý code này tôi viết theo kiểu có thể lấy dữ liệu trên nhiều file)

Xin cảm ơn bạn đã giúp đỡ và góp ý,
về việc thay đổi cấu trúc dữ liệu hiện giờ với tôi quả thực là điều rất khó vì tôi không có quyền quyết định và hơn nữa là file này cũng có liên kết với các file khác nếu mà thay đổi được như bạn gợi ý thì sẽ mất rất nhiều thời gian bạn ah.
Tôi cũng sẽ lưu ý góp ý này của bạn để rút kinh nghiệm cho những file sau này.

Xin trân trọng cảm ơn bạn rất nhiều.
 
Upvote 0
mình viết code dỡ lắm bạn ơi , bạn cứ kêu tên mình thì mình ráng sức vậy
...

haiz , bố trí dữ liệu kiểu gì là Quyền của người dùng , trừ khi người dùng bố trí quá phản khoa học , ở đây tôi thấy bố trí như file LayDuLieu như ban đầu chả có gì gọi là phản khoa học cả
Chuyện tên Cột có xài được tiếng Việt có dấu hay không ta bàn sau
Bây giờ tôi mời anh vào đây giao lưu : làm sao bố trí file LayDuLieu và Data y như ban đầu và trong 1 lần truy vấn duy nhất mà chỉ cần .CopyFromRecordset là ra luôn nội dung vùng G9:K14 mà tác giả đã làm sẵn bằng SUMIFS ?

Bạn doveandrose thân mến ơi, ... ,Bạn doveandrose thân mến ơi,
Thấy hấp dẫn quá bạn có thể bớt chút thời gian được không ạ? ...
Bạn doveandrose thân mến ơi!!!
 
Upvote 0
em nghiên cứu mà chưa có làm được , anh giúp em với
==================================
sử dụng những truy vấn đơn giản là đủ rồi
Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Data.xls" & _
    ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=true"";"
With Sheet1
    .Range("G9").CopyFromRecordset cn.Execute("select b.f20,b.f21,b.f22,b.f23,b.f24 from " & _
    " [" & ThisWorkbook.FullName & ";hdr=no;ReadOnly=true].[Sheet1$F9:F] a " & _
    " left join (select f1,sum(fG) as f20,sum(fH) as f21,sum(fI) as f22,sum(fJ) as f23,sum(fK) as f24 " & _
    " from (select f1,iif(f2='" & .[G7] & "',f3,null) as fG, " & _
    " iif(f2='" & .[H7] & "',f3,null) as fH, iif(f2='" & .[I7] & "',f3,null) as fI, " & _
    " iif(f2='" & .[J7] & "',f3,null) as fJ, iif(f2='" & .[K7] & "',f3,null) as fK " & _
    " from [Sheet1$C3:E]) group by f1) b on a.f1 = b.f1")
End With
cn.Close
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy bài đơn giản này có cần phải vác vây búa to thế không?
Nghiên cứu chi mấy thứ đó rồi cũng cho vào quên lãng. Dùng ADO thì đúng rồi nhưng chỉ cần cách phổ thông. Lấy ra mảng dữ liệu rồi muốn xử kiểu gì mà không được. Dùng Dic thỉ chỉ là nhấp nháy là có kết quả.
 
Upvote 0
em nghiên cứu mà chưa có làm được , anh giúp em với
==================================
sử dụng những truy vấn đơn giản là đủ rồi
Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Data.xls" & _
    ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=true"";"
With Sheet1
    .Range("G9").CopyFromRecordset cn.Execute("select b.f20,b.f21,b.f22,b.f23,b.f24 from " & _
    " [" & ThisWorkbook.FullName & ";hdr=no;ReadOnly=true].[Sheet1$F9:F] a " & _
    " left join (select f1,sum(fG) as f20,sum(fH) as f21,sum(fI) as f22,sum(fJ) as f23,sum(fK) as f24 " & _
    " from (select f1,iif(f2='" & .[G7] & "',f3,null) as fG, " & _
    " iif(f2='" & .[H7] & "',f3,null) as fH, iif(f2='" & .[I7] & "',f3,null) as fI, " & _
    " iif(f2='" & .[J7] & "',f3,null) as fJ, iif(f2='" & .[K7] & "',f3,null) as fK " & _
    " from [Sheet1$C3:E]) group by f1) b on a.f1 = b.f1")
End With
cn.Close
End Sub
CŨNG MUỐN theo bạn hoc ADO lắm nhưng nhìn thấy code này tịt luôn ...cố đọc tới lui Tịt vẫn hoàn Tịt.. --=0--=0 mong một ngày nào đó mình sẽ học được khoãng 20-30 % ADO của bạn
 
Upvote 0
CŨNG MUỐN theo bạn hoc ADO lắm nhưng nhìn thấy code này tịt luôn ...cố đọc tới lui Tịt vẫn hoàn Tịt.. --=0--=0 mong một ngày nào đó mình sẽ học được khoãng 20-30 % ADO của bạn
cái này gọi là gần chùa gọi bụt bằng anh đó Kiều Mạnh . trên địa bàn của Kiều Mạnh có nhân vật lừng danh nào thì Kiều Mạnh biết rồi đó . kiếm tôi làm gì .
 
Upvote 0
cái này gọi là gần chùa gọi bụt bằng anh đó Kiều Mạnh . trên địa bàn của Kiều Mạnh có nhân vật lừng danh nào thì Kiều Mạnh biết rồi đó . kiếm tôi làm gì .
vấn đề là mình muốn tu luyện code công của các đại môn phái ...xong chế ra một tuyệt kỷ của riêng mình thôi....,,,,,,,
 
Lần chỉnh sửa cuối:
Upvote 0
Đọc hoài mà hok có hiểu cái đoạn đỏ đỏ. Bạn doveandrose có thể giải thích thêm tí hok? Thấy có F tưởng là (Fields) gì đó. Mà lại có thêm chữ b.F nữa? khó hiểu quá. b. ở đây là lệnh gì vậy?
Với lại bạn giải thích trong code của bạn đoạn nào là xác định cột cần lấy dữ liệu ở file Data vậy? Nhìn đỏ con mắt mà hok có hiểu... Hic hic...món này khó nuốt quá ạ!

Cảm ơn!
Mấy cái b.f1..... Là truy xuất các trường từ bảng b, ví dụ b.f1 là truy xuất cột đầu tiên, b.f3 là truy xuất cột thứ 3, tui thì không khoái mấy cái f đó, tôi khoái gọi tên hơn
 
Upvote 0
Ado là code lười biến khá đơn giản, chỉ cần biết mấy quy tắc truy vấn và biết kết nối xem như là xong( đủ xài) học cái môn này khó nhất là thiết CSDL, mà trên diễn đàn hầu như không ai đụng đến, xem như phần khó này bỏ qua, như vậy ADO học để ứng dụng trên đây rất đơn giản
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom