quynhnamimex
Thành viên mới
- Tham gia
- 8/1/09
- Bài viết
- 18
- Được thích
- 7
mình lỗi vi phạm đăng bài vậy mình tự xóa rồi post lại bài hả bạnTiêu đề của bạn đang bị vi phạm nội quy
View attachment 229678
Bạn thử file này xem có được không nhé.Nhờ các thầy và anh chị trong group giúp dùm code chuyển từ bảng dữ liệu sang bảng kết quả
Em cám ơn các thầy và anh chị nhiều
View attachment 229669
hay quá cám ơn bạn rất nhiềuBạn thử file này xem có được không nhé.
Dữ liệu mà nhiều hơn thì nó trả kết quả đúng không anh ơiBạn thử file này xem có được không nhé.
Chà...! Này mà nhiều A00.... làm code lọc xỉu mệt ak ^^!Bạn thử file này xem có được không nhé.
Dữ liệu nhiều hơn thì bạn nên tách riêng từng nhóm ra.Dữ liệu mà nhiều hơn thì nó trả kết quả đúng không anh ơi
đúng rồi dữ liệu rất nhiều đây là bảng mô tả ít thôi, mình đang nghiên cứu cách mà chưa raChà...! Này mà nhiều A00.... làm code lọc xỉu mệt ak ^^!
dữ liệu rất nhiều nên không đúng, mình đang test cách mình làm nhưng chưa ra kết quảDữ liệu mà nhiều hơn thì nó trả kết quả đúng không anh ơi
Bạn cũng có thể sử dụng cách này để lọc nhiều dữ liệu hơn. Bạn dùng Remove Duplicates để lọc ra 1 DS không trùng Tên nguyên liệu, xác định dòng cuối mỗi lần thêm dòng, cứ thế mà nó sẽ chèn tới dữ liệu mình setup. Từ đó sẽ giải được bài toán này. Do mình đang khá bận nên chưa làm file dc, có thời gian mình làm cho !Dữ liệu nhiều hơn thì bạn nên tách riêng từng nhóm ra.
Cám ơn bạn nhiều, mình đang code thử mà chưa dc tại mình cần xuất ra giống vậyBạn cũng có thể sử dụng cách này để lọc nhiều dữ liệu hơn. Bạn dùng Remove Duplicates để lọc ra 1 DS không trùng Tên nguyên liệu, xác định dòng cuối mỗi lần thêm dòng, cứ thế mà nó sẽ chèn tới dữ liệu mình setup. Từ đó sẽ giải được bài toán này. Do mình đang khá bận nên chưa làm file dc, có thời gian mình làm cho !
Nếu dữ liệu như đề bài chỉ cần duyệt 1 vòng lặp for next là được thôi.còn nếu dữ liệu chưa sắp xếp chắc phải dùng dictionary.đúng rồi dữ liệu rất nhiều đây là bảng mô tả ít thôi, mình đang nghiên cứu cách mà chưa ra
Bài đã được tự động gộp:
dữ liệu rất nhiều nên không đúng, mình đang test cách mình làm nhưng chưa ra kết quả
Nhờ các thầy và anh chị trong group giúp dùm code chuyển từ bảng dữ liệu sang bảng kết quả
Option Explicit
Sub QueryData()
On Error GoTo EH
Application.ScreenUpdating = False
Dim oDuLieuRst As Object, oTenNLRst As Object
Dim sDulieuNR As String
Dim sDBFullPath As String, sTenNLSql As String, sDuLieuSql As String
Dim lngDestRow As Long, rstTotalRow As Long, rstFR As Long, rstLR As Long
'Ket noi toi file du lieu - là chính file Excel này
sDBFullPath = ThisWorkbook.FullName
ConnectDB sDBFullPath
'Xác dinh vùng du lieu can lay - dung cho cau lenh SQL
Dim lastRow As Long
lastRow = Sheet1.Cells(Sheet1.Rows.Count, 6).End(xlUp).Row
sDulieuNR = "A2:F" & lastRow
'Loc tên mã sô duy nhat dua vao recordset rieng
sTenNLSql = "SELECT DISTINCT MaSo, TenNL FROM " & sDulieuNR & " ORDER BY MaSo"
Set oTenNLRst = GetADORecordset(sTenNLSql)
Sheet1.Range("K4:O10000").ClearContents
lngDestRow = 4
oTenNLRst.MoveFirst
Do Until oTenNLRst.EOF
Sheet1.Range("K" & lngDestRow).Value = oTenNLRst!TenNL
Sheet1.Range("L" & lngDestRow).Value = oTenNLRst!MaSo
Sheet1.Range("K" & lngDestRow & ":L" & lngDestRow).Font.Bold = True
'Lay du lieu có cung Mã so
sDuLieuSql = "SELECT SoLo, NhaSX, NgayDuyet, TinhTrang FROM " & sDulieuNR & " WHERE MaSo Like '" & oTenNLRst!MaSo & "' ORDER BY SoLo"
Set oDuLieuRst = GetADORecordset(sDuLieuSql)
rstTotalRow = oDuLieuRst.RecordCount 'Tomg so dong cua Recordset vua filter
rstFR = lngDestRow + 1
rstLR = rstFR + rstTotalRow - 1
Sheet1.Range("L" & rstFR & ":O" & rstLR).Value = WorksheetFunction.Transpose(oDuLieuRst.getrows)
lngDestRow = lngDestRow + rstTotalRow + 1
oTenNLRst.MoveNext
Loop
oTenNLRst.Close
oDuLieuRst.Close
Set oDuLieuRst = Nothing
Set oTenNLRst = Nothing
Application.ScreenUpdating = True
EH_Exit:
Exit Sub
EH:
MsgBox "Có loi phat sinh." & vbNewLine & vbNewLine & _
"Ma loi: " & Err.Number & vbNewLine & _
"Noi dung loi: " & Err.Description, vbCritical, "Query Data Error"
Set oDuLieuRst = Nothing
Set oTenNLRst = Nothing
Resume EH_Exit
End Sub
Option Explicit
Private Const adUseClient As Long = 3
Private Const adLockReadOnly As Long = 1
Private Const adStateOpen As Long = 1
Private Const adCmdStoredProc As Long = 4
Private Const adParamOutput As Long = 2
Private Const adOpenDynamic As Long = 2
Private Const adOpenStatic As Long = 3
Private Const adCmdText = &H1
Private Const adCmdTable = 2
Global oCnn As Object
Public Function ConnectDB(strWBFullName As String) As Boolean
On Error GoTo ConnectDBError
Dim strConn As String
Dim blnNewConnect As Boolean
Dim blnReturn As Boolean
blnReturn = True
blnNewConnect = True
If Not oCnn Is Nothing Then 'Kiem tra xem có Connection chua, có rôi thi dung ket noi cu
If oCnn.State And adStateOpen = adStateOpen Then '-> Da có ket noi
blnNewConnect = False
End If
End If
If Val(Application.Version) < 12 Then
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strWBFullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes"";" 'HDR = No
Else
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strWBFullName & ";" & _
"Extended Properties=""Excel 12.0 XML;HDR=Yes"";" 'HDR = No
End If
If blnNewConnect Then
Set oCnn = CreateObject("ADODB.Connection")
oCnn.ConnectionString = strConn
oCnn.Open
End If
ConnectDBResume:
ConnectDB = blnReturn
Exit Function
ConnectDBError:
blnReturn = False
MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _
& "Noi dung: " & Err.Description, vbCritical, "ConnectDB"
Resume ConnectDBResume
End Function
Sub CloseMyConnection()
On Error GoTo HandleError
oCnn.Close
Set oCnn = Nothing
Exit Sub
HandleError:
If Err > 0 Then
MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _
& "Noi dung: " & Err.Description, vbCritical, "ConnectDB"
Exit Sub
End If
End Sub
Function GetADORecordset(strRst As String, Optional strSortFld As String) As Object 'ADODB.Recordset
On Error GoTo EH
Dim oRst As Object
Set oRst = CreateObject("ADODB.Recordset")
With oRst
.CursorLocation = adUseClient
.Open strRst, oCnn, adOpenDynamic, adLockReadOnly, adCmdText
If oRst.EOF And oRst.BOF Then
'MsgBox "Không có du lieu."
Set GetADORecordset = Nothing
Exit Function
End If
.Sort = strSortFld
.MoveFirst
End With
Set GetADORecordset = oRst
Exit Function
EH:
MsgBox "Có loi phat sinh." & vbNewLine & vbNewLine & _
"Ma loi: " & Err.Number & vbNewLine & _
"Noi dung loi: " & Err.Description, vbCritical, "GetADORecordset Function Error"
Set GetADORecordset = Nothing
Exit Function
End Function
Bạn thukhon2014 làm thừa cột mã số đúng ra PivotTable phải làm như hình.Cám ơn bạn nhiều, mình đang code thử mà chưa dc tại mình cần xuất ra giống vậy
xin hỏi bácĐóng góp một cách khác xử lý bằng câu lênh SQL (dùng ADO kết nối dữ liệu)
Tôi chỉ lấy dữ liệu ra theo yêu cầu trên hình còn việc định dạng Cell thì không rành và còn một cái chưa làm được trong đây là đánh số thứ tự. Mấy bạn rành code VBA Excel thì chuyện này chắc xử lý 30 giây, nhờ các bạn hỗ trợ giùm phần này.
- Trong bảng dữ liệu tôi có thêm tên các cột bằng tiếng Việt (không dấu, không khoảng trắng) để tiện việc truy vấn đích danh tên cột (Field) trong vùng dữ liệu. Có thể không dùng tên cột mà thay bằng bí danh như F1, F2... nhưng sau này có thể phát sinh thay đổi vị trí cột thì phải sửa nhiều trong câu lênh SQL nên tôi không dùng cách này.
- Code cho việc truy vấn dữ liệu:
Mã:Option Explicit Sub QueryData() On Error GoTo EH Application.ScreenUpdating = False Dim oDuLieuRst As Object, oTenNLRst As Object Dim sDulieuNR As String Dim sDBFullPath As String, sTenNLSql As String, sDuLieuSql As String Dim lngDestRow As Long, rstTotalRow As Long, rstFR As Long, rstLR As Long 'Ket noi toi file du lieu - là chính file Excel này sDBFullPath = ThisWorkbook.FullName ConnectDB sDBFullPath 'Xác dinh vùng du lieu can lay - dung cho cau lenh SQL Dim lastRow As Long lastRow = Sheet1.Cells(Sheet1.Rows.Count, 6).End(xlUp).Row sDulieuNR = "A2:F" & lastRow 'Loc tên mã sô duy nhat dua vao recordset rieng sTenNLSql = "SELECT DISTINCT MaSo, TenNL FROM " & sDulieuNR & " ORDER BY MaSo" Set oTenNLRst = GetADORecordset(sTenNLSql) Sheet1.Range("K4:O10000").ClearContents lngDestRow = 4 oTenNLRst.MoveFirst Do Until oTenNLRst.EOF Sheet1.Range("K" & lngDestRow).Value = oTenNLRst!TenNL Sheet1.Range("L" & lngDestRow).Value = oTenNLRst!MaSo Sheet1.Range("K" & lngDestRow & ":L" & lngDestRow).Font.Bold = True 'Lay du lieu có cung Mã so sDuLieuSql = "SELECT SoLo, NhaSX, NgayDuyet, TinhTrang FROM " & sDulieuNR & " WHERE MaSo Like '" & oTenNLRst!MaSo & "' ORDER BY SoLo" Set oDuLieuRst = GetADORecordset(sDuLieuSql) rstTotalRow = oDuLieuRst.RecordCount 'Tomg so dong cua Recordset vua filter rstFR = lngDestRow + 1 rstLR = rstFR + rstTotalRow - 1 Sheet1.Range("L" & rstFR & ":O" & rstLR).Value = WorksheetFunction.Transpose(oDuLieuRst.getrows) lngDestRow = lngDestRow + rstTotalRow + 1 oTenNLRst.MoveNext Loop oTenNLRst.Close oDuLieuRst.Close Set oDuLieuRst = Nothing Set oTenNLRst = Nothing Application.ScreenUpdating = True EH_Exit: Exit Sub EH: MsgBox "Có loi phat sinh." & vbNewLine & vbNewLine & _ "Ma loi: " & Err.Number & vbNewLine & _ "Noi dung loi: " & Err.Description, vbCritical, "Query Data Error" Set oDuLieuRst = Nothing Set oTenNLRst = Nothing Resume EH_Exit End Sub
- Các hàm dùng trong Sub QueryData().
Mã:Option Explicit Private Const adUseClient As Long = 3 Private Const adLockReadOnly As Long = 1 Private Const adStateOpen As Long = 1 Private Const adCmdStoredProc As Long = 4 Private Const adParamOutput As Long = 2 Private Const adOpenDynamic As Long = 2 Private Const adOpenStatic As Long = 3 Private Const adCmdText = &H1 Private Const adCmdTable = 2 Global oCnn As Object Public Function ConnectDB(strWBFullName As String) As Boolean On Error GoTo ConnectDBError Dim strConn As String Dim blnNewConnect As Boolean Dim blnReturn As Boolean blnReturn = True blnNewConnect = True If Not oCnn Is Nothing Then 'Kiem tra xem có Connection chua, có rôi thi dung ket noi cu If oCnn.State And adStateOpen = adStateOpen Then '-> Da có ket noi blnNewConnect = False End If End If If Val(Application.Version) < 12 Then strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strWBFullName & ";" & _ "Extended Properties=""Excel 8.0;HDR=Yes"";" 'HDR = No Else strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWBFullName & ";" & _ "Extended Properties=""Excel 12.0 XML;HDR=Yes"";" 'HDR = No End If If blnNewConnect Then Set oCnn = CreateObject("ADODB.Connection") oCnn.ConnectionString = strConn oCnn.Open End If ConnectDBResume: ConnectDB = blnReturn Exit Function ConnectDBError: blnReturn = False MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _ & "Noi dung: " & Err.Description, vbCritical, "ConnectDB" Resume ConnectDBResume End Function Sub CloseMyConnection() On Error GoTo HandleError oCnn.Close Set oCnn = Nothing Exit Sub HandleError: If Err > 0 Then MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _ & "Noi dung: " & Err.Description, vbCritical, "ConnectDB" Exit Sub End If End Sub Function GetADORecordset(strRst As String, Optional strSortFld As String) As Object 'ADODB.Recordset On Error GoTo EH Dim oRst As Object Set oRst = CreateObject("ADODB.Recordset") With oRst .CursorLocation = adUseClient .Open strRst, oCnn, adOpenDynamic, adLockReadOnly, adCmdText If oRst.EOF And oRst.BOF Then 'MsgBox "Không có du lieu." Set GetADORecordset = Nothing Exit Function End If .Sort = strSortFld .MoveFirst End With Set GetADORecordset = oRst Exit Function EH: MsgBox "Có loi phat sinh." & vbNewLine & vbNewLine & _ "Ma loi: " & Err.Number & vbNewLine & _ "Noi dung loi: " & Err.Description, vbCritical, "GetADORecordset Function Error" Set GetADORecordset = Nothing Exit Function End Function
View attachment 229722
xin hỏi bác
ongke0711 làm nghề gì mà học những cái cao siêu thế này; e hỏi ngu ứng dụng trong việc gì ạ ? e mới vào diễn đàn công nhận nhiều cao thủ quá !!!