Xin code tự động nhập địa chỉ ô của Parameter Value trong Query Excel
Em xin các anh chị tư vấn code cho em trường hợp này:
Em tạo một query trong excel có dạng SQL như sau :
SELECT Name.Name, Name.`Nam sinh`
FROM `C:QueryBook1`.Name Name
WHERE (Name.Name=?)
rồi em ghi lại Query này ra chỗ khácCái dấu "?" này là địa chỉ ô Parameter Value của Query em phải nhập.
Sau đó em dùng ghi Macro để ghi lại việc em nhập Query này vào bảng excel của mình và em thấy code như sau:
Sub Macro() Sheets("Sheet1").Select Range("D2").Select With ActiveSheet.QueryTables.Add(Connection:= _ "ODBC;DSN=Excel Files;DBQ=C:QueryBook1.xls;DefaultDir=C:Query;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _ , Destination:=Range("D2")) .CommandText = Array( _ "SELECT Name.Name, Name.`Nam sinh` FROM `C:QueryBook1`.Name Name WHERE ([B][COLOR="red"]Name.Name=?[/COLOR][/B])" _ ) .Name = "Query from Excel Files_2" .FieldNames = False .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False .RefreshStyle = xlOverwriteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .PreserveColumnInfo = False .SourceConnectionFile = "C:QueryQuery from Excel Files.dqy" .Refresh BackgroundQuery:=False End With End SubỞ chỗ em bôi đỏ ở trên trong code em muốn thay bằng địa chỉ ô cụ thể thì phải nhập cái gì vào ạ? Ví dụ em muốn nhập thay dấu chấm hỏi đó là địa ô C2 để khi đó chạy Macro máy sẽ tự động hiểu "?" là ô C2 mà không bắt mình nhập vào Parameter Value nữa.
Em xin chân thành cảm ơn các bác trước
em gửi thêm cái file, các bác giải nén vào ổ C nhé
"SELECT Name.Name, Name.`Nam sinh` FROM `C:QueryBook1`.Name Name WHERE (Name.Name=?)" _
)
Bạn thử thay bằng
"SELECT Name.Name, Name.`Nam sinh` FROM `C:QueryBook1`.Name Name WHERE ([COLOR=black]Name.Name=[/COLOR])" [COLOR=red][B]& [C2][/B][/COLOR] _
)
Em cảm ơn bác vì bác đã quan tâm, nhưng vẫn không được anh à, nó vẫn báo lỗi khi em thay vào như bác, bác cố gắng giúp em với
Xin lỗi, tôi gõ nhầm: Sai vị trí dấu ngoặc và thiếu cặp dấu nháy đơn.
"SELECT Name.Name, Name.`Namsinh` FROM `C:QueryBook1`.Name Name WHERE (Name.Name= [COLOR=red]'[/COLOR]" & [c2] & "[COLOR=red]')[/COLOR]" _
)
www.giaiphapexcel.com/diendan/threads/xin-code-t%E1%BB%B1-%C4%91%E1%BB%99ng-nh%E1%BA%ADp-%C4%91%E1%BB%8Ba-ch%E1%BB%89-%C3%B4-c%E1%BB%A7a-parameter-value-trong-query-excel.45888/
Kỹ năng giải quyết vấn đề hiệu quả
Mô tả Nội dung Đánh giá Tài nguyên KỸ NĂNG GIẢI QUYẾT VẤN ĐỀ HIỆU QUẢHiểu đúng vấn đề là một nửa của giải...
Xem khóa học
Bạn thử đổi C2 từ hung thành hang, hoặc ngược lại, rồi chạy code xem?
Nếu cần bạn thêm vào code dòng lệnh xoá các dòng dữ liệu cũ, chép đè dữ liệu mới lên.
Muốn khi thay C2, code tự chạy 1 cách tự động thì đưa vào sự kiện Workbook_Change.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
For Each nm In ActiveWorkbook.Names
If Left(nm.Name, 14) = "Sheet1!MyQuery" Then Range(nm).Clear: nm.Delete
Next
MakeQuery
End If
End Sub
TB:
Bạn xài add-in hay phiên bản nào mà ra cái hộp thoại như hình vậy?
Xét theo hình bạn đưa lên và cách bạn giải thích, thì bạn đã làm xong rồi còn gì?
Name tăng 1 số nhưng số bao nhiêu tôi cũng xoá đi được, lúc nào cũng chỉ tồn tại 1 name.
Tôi chưa kiểm tra được tạo lại query hay refresh query có sẵn cái nào nhanh hơn, nhưng, chắc chắn 1 điều là không khác nhau về việc tốn ram. Bản chất refresh query cũng là chạy lại câu lệnh SQL với toàn bộ dữ liệu. Tạo mới query cũng thế.
Huống hồ refresh với tham số thay đổi, cũng như tạo mới còn gì.
Tôi sử dụng lại file gốc của bạn, chạy code 1 lần, hiện thông báo như cái hình của bạn, chọn C2, đánh dấu vào 2 ô vuông.
Thế là chạy y như bạn muốn và còn hơn nữa: Khi thay giá trị C2, lập tức Query tự refresh, khỏi nhấn refresh bằng chuột.
Vậy bạn muốn gì hơn nữa?
Chuyện này hầu như là không thể. Do câu SQL có 1 dấu ? nên bắt buộc phải ra cái hộp thoại hỏi. Excel và VBA chưa có cách nào đánh ô chọn (không phải lần nào cũng C2) và uýnh dấu chọn 2 ô checkbox, của 1 dialogbox chứ không phải userform.
Còn chuyện ai đó xoá query hoặc chính ta muốn xoá query trước khi đóng file cho nhẹ:
Dùng code của tôi thì mặc kệ ai muốn xoá thì xoá, còn trước khi đóng file thêm 1 câu lệnh xoá thì nó sẽ xoá (cả name và cả query). Sau đó chỉ cần điền nội dung vào C2 là có lại như cũ, hoặc muốn tự động thì cho chạy code khi mở file.
Dùng cái của bạn thì cũng chẳng cản được người ta xoá, và nếu người ta xoá cả query và cả name thì lấy cái gì mà refresh?
Cám ơn bạn có ý muốn trao đổi, tôi cũng muốn học thêm từ bạn. Xin vui lòng liên hệ Y!M thanhmy_pham, Skype ptm0412, Hand phone 0919 77 2142
Dùng SendKeys với 1 chút tà đạo:
Sub Macro()
Sheets("Sheet1").Select
Range("C1").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=Excel Files;DBQ=C:QueryBook1.xls;DefaultDir=C:Query;DriverId=790;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("D2"))
.CommandText = Array( _
"SELECT Name.Name, Name.`Nam sinh` FROM `C:QueryBook1`.Name Name WHERE (Name.Name=?)" _
)
With Application
.SendKeys "{Down}"
.SendKeys "{TAB}"
.SendKeys " "
.SendKeys "{TAB}"
.SendKeys "chr(32)"
.SendKeys "{Enter}"
End With
.Name = "Query from Excel Files_2"
.FieldNames = True
.RefreshStyle = xlOverwriteCells
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 60
.PreserveColumnInfo = False
.SourceConnectionFile = "C:QueryQuery from Excel Files.dqy"
.Refresh BackgroundQuery:=False
End With
End Sub
Mình mới làm lần đầu í mà. Cám ơn NghiaPhuc nha.
Có lẽ nên viết vầy cho đúng quy tắc: tác vụ nhấn phím Space (khoảng trắng) gởi qua SendKeys cũng bao quanh bởi cặp dấu {}
Application.SendKeys "{Down}{TAB}{ }{TAB}{ }{Enter}"
To specify characters that aren't displayed when you press a key, such as ENTER or TAB, and keys that represent actions rather than characters, use the codes enclose them in { and }.
Được tất nhiên là được, vì ở trên mình dùng " " và cả "Chr(32)" đều chạy. Còn câu tiếng Anh (mấychữ tô đậm) có nghĩa là:
Nếu những Keys được gởi đi mang ý nghĩa thực hiện 1 tác vụ (action) chứ không phải chuỗi ký tự (cần gõ vào khung text chằng hạn) thì nên bao lại bằng cặp dấu {}.
Vụ này do anh Bill Dự phòng cho trường hợp ta sendkeys đến cả những chương trình khác như word, notepad, IE, … Và nhỡ mà những phần mềm đó hiểu sai là 1 khoảng trắng thay vì 1 tác vụ chọn/bỏ chọn cái checkbox.