Hỏi về cách truy xuất dữ liệu từ CSDL (1 người xem)

Liên hệ QC

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

sondaubac

Thành viên hoạt động
Tham gia
14/10/08
Bài viết
168
Được thích
30
Mình có một bảng Cơ Sở Dữ Liệu gồm 2 sheet CSDL tên
1/ Sheet thứ nhất (CSDL tenCV) : chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai (CSDL DM): Chứa CSDL cụ thể là định mức của từng công việc
3/ Sheet thứ ba (TDVT) : Chứa tên của các loại vật tư và đơn vị tính của nó

Nhờ mọi người viết dùm mình 1 CODE hoặc FUNCTION để xuất dữ liệu sang sheet xuatDL (đã update lại file theo ngày)
 

File đính kèm

Lần chỉnh sửa cuối:
Mình có một bảng Cơ Sở Dữ Liệu gồm 2 sheet CSDL tên
1/ Sheet thứ nhất (CSDL tenCV) : chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai (CSDL DM): Chứa CSDL cụ thể là định mức của từng công việc

Nhờ mọi người viết dùm mình 1 CODE hoặc FUNCTION để xuất dữ liệu sang sheet xuatDL
Trong File đính kèm của anh đâu có sheet xuatDL đâu
Mà em tìm thấy bài 4 của Topic này đáp ứng được yêu cầu của anh đó :p
 
Lần chỉnh sửa cuối:
Mình có một bảng Cơ Sở Dữ Liệu gồm 2 sheet CSDL tên
1/ Sheet thứ nhất (CSDL tenCV) : chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai (CSDL DM): Chứa CSDL cụ thể là định mức của từng công việc

Nhờ mọi người viết dùm mình 1 CODE hoặc FUNCTION để xuất dữ liệu sang sheet xuatDL
Bạn muốn hỏi thật hay đùa, File bạn có 5 sheet mà chẳng có tên sheet nào là xuatDL.
 
Lần chỉnh sửa cuối:
Xin lỗi các bạn, mình đã update file lại rồi đó.

Trong File đính kèm của anh đâu có sheet xuatDL đâu
Mà em tìm thấy bài 4 của Topic này đáp ứng được yêu cầu của anh đó :p

Bài 4 của Topic này chưa làm được như nguyện vọng của mình. Rất mong các bạn giúp đỡ
 
Hãy ngưng ngay chuyện đùa dai đi bạn!

File bạn đã Update có quái gì là dữ liệu đâu chứ!

Trong trang tính bạn cần hiện số liệu báo cáo thì iêu cầu là:
Phần này dựa vào mã hiệu và tra cứu trong sheet CSDL DM
và sắp xếp vào các vùng cụ thể: VẬT LIỆU, NHÂN CÔNG, MÁY

Nhưng trong các trang tính chả có mống nào thuộc về vật liệu, nhân công hay ca máy cả thì làm sao?

Vĩnh biệt!
 
Mình có một bảng Cơ Sở Dữ Liệu gồm 2 sheet CSDL tên
1/ Sheet thứ nhất (CSDL tenCV) : chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai (CSDL DM): Chứa CSDL cụ thể là định mức của từng công việc

Nhờ mọi người viết dùm mình 1 CODE hoặc FUNCTION để xuất dữ liệu sang sheet xuatDL
Chẳng hiểu muốn làm cái gì? Xem File có 3 kiểu dùng (ở 3 sheet cuối).

Góp ý:
Tại sheet PTVT không nên gán hàm ở Cel F65536, Excel sẽ hiểu sử dụng 65536 dòng (làm tăng dung lượng File vô ích), tôi đã xử lý còn 62KB.
 

File đính kèm

Lần chỉnh sửa cuối:
Hãy ngưng ngay chuyện đùa dai đi bạn!

File bạn đã Update có quái gì là dữ liệu đâu chứ!

Trong trang tính bạn cần hiện số liệu báo cáo thì iêu cầu là:


Nhưng trong các trang tính chả có mống nào thuộc về vật liệu, nhân công hay ca máy cả thì làm sao?

Vĩnh biệt!
Nó đây, bởi vì mình không hiện tên của các loại vật liệu theo mã mà thôi. Còn nếu mà sử dụng pivot table thì nói làm gì nữa... Cái mình cần là căn cứ vào cơ sở dữ liệu mà mình sẽ lập thì có xuất ra dữ liệu như sheet xuatDL mà mình mong muốn có được không?
 

File đính kèm

Lần chỉnh sửa cuối:
Chẳng hiểu muốn làm cái gì? Xem File có 3 kiểu dùng (ở 3 sheet cuối).

Góp ý:
Tại sheet PTVT không nên gán hàm ở Cel F65536, Excel sẽ hiểu sử dụng 65536 dòng (làm tăng dung lượng File vô ích), tôi đã xử lý còn 62KB.
Cảm ơn bạn, tuy nhiên chưa đúng như mong muốn của mình..... Ý của mình ở đây là:
Mình có Cơ Sở Dữ Liệu gồm 2 sheet
1/ Sheet thứ nhất (CSDL tenCV) : chỉ dùng để tra cứu tên công việc
2/ Sheet thứ hai (CSDL DM): dùng để tra cứu định mức cho từng công việc
Cái mà mình mong muốn là làm cách nào sử dụng VBA để xuất được dữ liệu đó ra mà các dữ liệu đó nằm trong từng mục cụ thể (Gần giống như Pivot table )
 
Cảm ơn bạn, tuy nhiên chưa đúng như mong muốn của mình..... Ý của mình ở đây là:
Mình có Cơ Sở Dữ Liệu gồm 2 sheet
1/ Sheet thứ nhất (CSDL tenCV) : chỉ dùng để tra cứu tên công việc
2/ Sheet thứ hai (CSDL DM): dùng để tra cứu định mức cho từng công việc
Cái mà mình mong muốn là làm cách nào sử dụng VBA để xuất được dữ liệu đó ra mà các dữ liệu đó nằm trong từng mục cụ thể (Gần giống như Pivot table )
Em mới tìm được cái này Anh xem có được không
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Dulieu, Ketqua, I As Long, K As Long, Ivl As Long, Inc As Long, Imay As Long
    Dim VL As String, Nc As String, May As String, LaMa As Long
    Dim Ma As String, Mahieu As String
VL = "V" & ChrW$(7853) & "t li" & ChrW$(7879) & "u"
Nc = "Nh" & ChrW$(226) & "n c" & ChrW$(244) & "ng"
May = "M" & ChrW$(225) & "y"
On Error Resume Next
If Not Intersect(Target, [B7:B10000]) Is Nothing Then
    If Target.Count = 1 Then
        Mahieu = Sheets("XuatDL").Range("B" & Target.Row)
        With Sheets("CSDL DM")
            Dulieu = .Range("B8", .Range("B65535").End(3)).Resize(, 7)
        End With
        ReDim Ketqua(1 To UBound(Dulieu), 1 To 7)
        For I = 1 To UBound(Dulieu)
            Ma = Dulieu(I, 1)
            If Ma = Mahieu Then
                K = K + 1
                If K = 1 Then
                    Ketqua(K, 2) = "=VLOOKUP(RC[-2],'CSDL tenCV'!R6C2:R1800C4,2,0)"
                    Ketqua(K, 3) = "=VLOOKUP(RC[-3],'CSDL tenCV'!R6C2:R1800C4,3,0)"
                End If
                If K > 1 Then
                    If Dulieu(I, 5) = VL Then
                        Ivl = Ivl + 1
                        If Ivl = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & VL
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 3):  Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                    If Dulieu(I, 5) = Nc Then
                        Inc = Inc + 1
                        If Inc = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & Nc
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2):  Ketqua(K, 2) = Dulieu(I, 3): Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                    If Dulieu(I, 5) = May Then
                        Imay = Imay + 1
                        If Imay = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & May
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 3): Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                End If
            End If
        Next I
        If K Then
            Target.Offset(, 1).Resize(K, 5) = Ketqua
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders.LineStyle = 1
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders(xlInsideHorizontal).Weight = xlHairline
        Else
            MsgBox "Khong tim thay"
        End If
    End If
End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Ôi cảm ơn bạn, đúng là cái mà mình đang cần tìm. Từ giờ mình có thể căn cứ vào CODE này và tự làm 1 phần mềm dự toán đơn giản để sử dụng cho riêng mình. Mình sẽ up lên diễn đàn cho các bạn dùng chung
 
Ôi cảm ơn bạn, đúng là cái mà mình đang cần tìm. Từ giờ mình có thể căn cứ vào CODE này và tự làm 1 phần mềm dự toán đơn giản để sử dụng cho riêng mình. Mình sẽ up lên diễn đàn cho các bạn dùng chung
Anh thay cái code cũ bằng cái này đi (Em thêm cái xóa dữ liệu cũ xong rồi điền dữ liệu mới phòng khi mình cập nhật lại mã hiệu)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Dulieu, Ketqua, I As Long, K As Long, Ivl As Long, Inc As Long, Imay As Long
    Dim VL As String, Nc As String, May As String, LaMa As Long
    Dim Ma As String, Mahieu As String, Er As Long, dongcuoi As Long
VL = "V" & ChrW$(7853) & "t li" & ChrW$(7879) & "u"
Nc = "Nh" & ChrW$(226) & "n c" & ChrW$(244) & "ng"
May = "M" & ChrW$(225) & "y"
On Error Resume Next
If Not Intersect(Target, [B7:B10000]) Is Nothing Then
    If Target.Count = 1 Then
        Mahieu = Sheets("XuatDL").Range("B" & Target.Row)
        With Sheets("CSDL DM")
            Dulieu = .Range("B8", .Range("B65535").End(3)).Resize(, 7)
        End With
        ReDim Ketqua(1 To UBound(Dulieu), 1 To 7)
        For I = 1 To UBound(Dulieu)
            Ma = Dulieu(I, 1)
            If Ma = Mahieu Then
                K = K + 1
                If K = 1 Then
                    Ketqua(K, 2) = "=VLOOKUP(RC[-2],'CSDL tenCV'!R6C2:R1800C4,2,0)"
                    Ketqua(K, 3) = "=VLOOKUP(RC[-3],'CSDL tenCV'!R6C2:R1800C4,3,0)"
                End If
                If K > 1 Then
                    If Dulieu(I, 5) = VL Then
                        Ivl = Ivl + 1
                        If Ivl = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & VL
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 3):  Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                    If Dulieu(I, 5) = Nc Then
                        Inc = Inc + 1
                        If Inc = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & Nc
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2):  Ketqua(K, 2) = Dulieu(I, 3): Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                    If Dulieu(I, 5) = May Then
                        Imay = Imay + 1
                        If Imay = 1 Then
                            LaMa = LaMa + 1
                            Ketqua(K, 2) = ChrW(LaMa + 96) & "). " & May
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 3): Ketqua(K, 5) = Dulieu(I, 4)
                    End If
                End If
            End If
        Next I
        If K Then
            Er = Target.End(xlDown).Row: dongcuoi = Range("D" & Rows.Count).End(3).Row
            If Er < dongcuoi Then
                Range("A" & Target.Row + 1 & ":G" & Er - 1).Delete
                Range("A" & Target.Row + 1 & ":G" & Target.Row + 1).Resize(K - 1).EntireRow.Insert
            End If
            Target.Offset(, -1).ClearContents
            If Target.Row = 7 Then
                Target.Offset(, -1) = 1
            Else
                Target.Offset(, -1) = Application.Max(Range("A7:A" & Target.Row - 1)) + 1
            End If
            Target.Offset(, 1).Resize(K, 5) = Ketqua
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders.LineStyle = 1
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders(xlInsideHorizontal).Weight = xlHairline
        End If
    End If
End If
End Sub
 
Lần chỉnh sửa cuối:
Hay quá, cảm ơn bạn... Ước gì mình có thể hiểu được mấy cái CODE này :(
Bạn có thể giải thích cụ thể từng dòng được không? Hoặc là thuật toán của nó ấy. Mình cũng muốn tìm hiểu mà khó quá
" If Not Intersect(Target, [B7:B10000]) Is Nothing Then " Dòng này là sao vậy bạn?
...
Còn nữa, mình lập cơ sở dữ liệu còn thiếu 1 sheet nữa. (Vì vẫn chưa có đơn vị tính của từng loại vật tư) Đó là sheet Tiêu đề tên vật tư căn cứ theo mã hiệu vật tư để xác định tên vật tư và đơn vị tính
Mình sẽ sửa lại file Cơ Sở Dữ Liệu gồm 3 sheet
1/ Sheet thứ nhất: chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai: Chứa CSDL cụ thể là định mức của từng công việc
3/ Sheet thứ ba (TDVT): Chứa tiêu đề tên vật tư, căn cứ vào mã hiệu của vật tư
3 sheet này sẽ là cơ sở dữ liệu để xuất dữ liệu sang sheet Phân tích vật tư. Mình sẽ làm lại file excel cơ sở dữ liệu nhé
 
Lần chỉnh sửa cuối:
Hay quá, cảm ơn bạn... Ước gì mình có thể hiểu được mấy cái CODE này :(
Bạn có thể giải thích cụ thể từng dòng được không? Hoặc là thuật toán của nó ấy. Mình cũng muốn tìm hiểu mà khó quá
" If Not Intersect(Target, [B7:B10000]) Is Nothing Then " Dòng này là sao vậy bạn?
...
Còn nữa, mình lập cơ sở dữ liệu còn thiếu 1 sheet nữa. (Vì vẫn chưa có đơn vị tính của từng loại vật tư) Đó là sheet Tiêu đề tên vật tư căn cứ theo mã hiệu vật tư để xác định tên vật tư và đơn vị tính
Mình sẽ sửa lại file Cơ Sở Dữ Liệu gồm 3 sheet
1/ Sheet thứ nhất (CSDL tenCV) : chứa CSDL dựa vào mã hiệu có chứa tên công việc, đơn vị tính
2/ Sheet thứ hai (CSDL DM): Chứa CSDL cụ thể là định mức của từng công việc
3/ Sheet thứ ba (TDVT): Chứa tiêu đề tên vật tư, căn cứ vào mã hiệu của vật tư
3 sheet này sẽ là cơ sở dữ liệu để xuất dữ liệu sang sheet Phân tích vật tư. Mình sẽ làm lại file excel cơ sở dữ liệu nhé
Em có biết đâu. Code đó làm em đi Copy về mà -\\/.
 
mình sửa lại dữ liệu rồi đó bạn. Bạn xem rồi sửa CODE dùm mình với. Hic
 

File đính kèm

Khối lượng thì lấy ở chỗ nào vào vậy Bác . Xong rồi nữa thì làm gì tiếp nữa đây :(
Mình chỉ cần xuất dữ liệu thôi, mình đã sửa lại là có 3 sheet làm cơ sở dữ liệu đó bạn.

Nếu không thì giúp mình hiểu CODE VBA để mình sửa CODE cũng được... Đọc vào tù mù quá :(

Giải thích dùm mình mấy câu này cũng được

1/ Gán các biến VL, NC, May này có phải là để tra cứu trước mỗi loại vật liệu, nhân công, máy hay không?
VL = "V" & ChrW$(7853) & "t li" & ChrW$(7879) & "u" < ----------- Vật Liệu
Nc = "Nh" & ChrW$(226) & "n c" & ChrW$(244) & "ng" < ----------- Nhân công
May = "M" & ChrW$(225) & "y" < ----------- Máy


2/ Câu lệnh này If Target.Count = 1 Then
có phải là Nếu số ô thay đổi bằng 1 thì .....

3/ Intersect nghĩa là giao cắt, Target nghĩa là ô bị thay đổi trong sự kiện worksheet_ change .
Như vậy với câu lệnh
If Not Intersect(Target, [B7:B10000]) Is Nothing Then
Có phải là :
nếu có sự thay đổi từ ô B7 đến ô B10000) thì làm ..... đúng không bạn? Nhờ bạn sửa dùm file này với
 

File đính kèm

Lần chỉnh sửa cuối:
Mọi người giúp mình với
 
Ôi cảm ơn bạn, đúng là cái mà mình đang cần tìm. Từ giờ mình có thể căn cứ vào CODE này và tự làm 1 phần mềm dự toán đơn giản để sử dụng cho riêng mình. Mình sẽ up lên diễn đàn cho các bạn dùng chung

mình sửa lại dữ liệu rồi đó bạn. Bạn xem rồi sửa CODE dùm mình với. Hic

Thế này là thế nào?
 
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Dulieu, Ketqua, I As Long, K As Long, Ivl As Long, Inc As Long, Imay As Long
    Dim VL As String, Nc As String, May As String, LaMa As Long
    Dim Ma As String, Mahieu As String
VL = "V" & ChrW$(7853) & "t li" & ChrW$(7879) & "u"
Nc = "Nh" & ChrW$(226) & "n c" & ChrW$(244) & "ng"
May = "M" & ChrW$(225) & "y"
On Error Resume Next
If Not Intersect(Target, [B7:B10000]) Is Nothing Then
    If Target.Count = 1 Then
        Mahieu = Sheets("XuatDL").Range("B" & Target.Row)
        With Sheets("CSDL DM")
            Dulieu = .Range("B5", .Range("B65535").End(3)).Resize(, 6)                  ' Chon vung DL dinh muc tu o B5 den G...
        End With
        ReDim Ketqua(1 To UBound(Dulieu), 1 To 6)       ' Mang KETQUA co so dong cua DULIEU va So COT = 6
        
        For I = 1 To UBound(Dulieu)
        
            Ma = Dulieu(I, 1)           ' Ma = Ma hieu cong viec o cot 1 cua Mang DuLieu
            
            If Ma = Mahieu Then
            
                K = K + 1               ' Mac dinh ban dau K = 0 + 1 = 1
                                        ' Bien K la bien chay trong mang KET QUA
                
                
                If K = 1 Then           ' Neu K = 1 thi Chay dong dau tien, tim ten CV, DVT, KL = 1
                
                    Ketqua(K, 2) = "=VLOOKUP(RC[-2],'CSDL tenCV'!R5C2:R1800C4,2,0)"     ' Tim ten CV trong CSDL tenCV
                    Ketqua(K, 3) = "=VLOOKUP(RC[-3],'CSDL tenCV'!R5C2:R1800C4,3,0)"     ' Tim DVT cua cong viec trong CSDL tenCV
                    Ketqua(K, 4) = 1                                                    ' Gan Khoi luong = 1

                ElseIf K > 1 Then       ' Neu K > 1 thi gan gia tri cho mang KET QUA tu mang Du Lieu
                    'I = I - 1           ' Phai giam bien chay I xuong 1 don vi vi thieu 1 dong
                    If Dulieu(I, 4) = VL Then                                        ' Neu cot so 4 cua sheet CSDL DM la VAT LIEU thi lam ....
                        Ivl = Ivl + 1
                        If Ivl = 1 Then
                            Ketqua(K, 2) = ChrW(97) & "). " & VL                        ' Danh chu a). Vat Lieu
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 5): Ketqua(K, 5) = Dulieu(I, 3)
                    End If
                    
                    If Dulieu(I, 4) = Nc Then
                        Inc = Inc + 1
                        If Inc = 1 Then
                            Ketqua(K, 2) = ChrW(98) & "). " & Nc                        ' Danh chu b). Nhan Cong
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2):  Ketqua(K, 2) = Dulieu(I, 5): Ketqua(K, 5) = Dulieu(I, 3)
                    End If
                    
                    If Dulieu(I, 4) = May Then
                        Imay = Imay + 1
                        If Imay = 1 Then
                            Ketqua(K, 2) = ChrW(99) & "). " & May                       ' Danh chu c). May
                            K = K + 1
                        End If
                        Ketqua(K, 1) = Dulieu(I, 2): Ketqua(K, 2) = Dulieu(I, 5): Ketqua(K, 5) = Dulieu(I, 3)
                    End If
                    'I = I + 1
                    
                End If      ' Ket thuc khi K = 1 hoac la K > 1
            End If          ' Ket thuc khi MA = MA HIEU
        Next I
        If K Then
            Target.Offset(, 1).Resize(K, 5) = Ketqua
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders.LineStyle = 1
            Range("A" & Target.Row & ":G" & Target.Row).Resize(K).Borders(xlInsideHorizontal).Weight = xlHairline
        Else
            MsgBox "Khong tim thay"
        End If
    End If
End If
End Sub
Mình sửa lại file rồi, nhưng CODE bị vướng 1 chút vì truy xuất dữ liệu bị thiếu dòng dữ liệu đầu tiên
 

File đính kèm

Web KT

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

Back
Top Bottom