Xin giúp đỡ về tham chiếu (1 người xem)

Liên hệ QC

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

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
461
Được thích
20
Xin chào mọi người!

Em có 1 bài toán về tham chiếu lập trình trong excel, nhưng do kiến thức còn hạn chế nên em rất mong mọi người xem và giúp đỡ ạ.

Em có gửi file đính kèm mô tả qua về 1 dạng tham chiếu mà em đang muốn xin giúp đỡ ạ. Em xin trình bày trong File như sau :

- Trong file có 2 bang. Bảng " Des " và bang " Origin ". Và các items trong bang " Des " sẽ được tham chiếu từ bang " Origin " ạ.

- Trong bang " Des " thì Item " Keo " sẽ đc tham chiếu lấy giá trị từ Item " A " trong bang " Origin "
Item " But " sẽ là tham chiếu là tổng của 2 item " B " & " C " trong bang " Origin "
Item " Muc " sẽ là tham chiếu của item " D " trong bang " Origin ". Nhưng là tham chiếu của D 1 ngày trước ó. Ví du : " Muc " ngày 15/3 sẽ là " D " của ngày 14/3.

Trong file ở bang " Des " em có input vài giá trị để mọi người xem qua ạ.

Trong file chính của em thì file data rất nhiều cột và hang ạ. Nên em gửi file mô tả bài toán same same như đính kèm ạ.

Rất mong các thầy và mọi người giúp em lập trình VBA để giải quyết bài toán này ạ.

Em xin trân trọng cảm ơn!
 

File đính kèm

E xin phép thi thoảng để lại dấu " . " cho đỡ trôi bài ạ.
 
Upvote 0
File của bạn như kiểu:
Cuối ngày thống kê xem hôm nay cấp phát bao nhiêu bộ kéo, thước ... cho các ca làm việc phải không?
 
Upvote 0
File của bạn như kiểu:
Cuối ngày thống kê xem hôm nay cấp phát bao nhiêu bộ kéo, thước ... cho các ca làm việc phải không?

Cảm ơn bạn đã ghé qua!

Cũng 1 dạng như thế bạn ạ... File gốc của mình data rất nhiều ( cột và hang đến vài tram ). Nên mình tóm tắt đưa ra 1 bang kiểu như này để ví dụ bạn ạ.

Ví dụ : Trong ngày 14/3, Với cũng mã C1 thì item " Keo " ở bang " Des " dc tham chieu từ giá trị item A bang " Oggirin "

Cảm ơn bạn!

Bảng " Des " đc tham chiếu giá trị từ bang " origin "..
 
Upvote 0
Minh de lai dau cham cho do troi bai!

Cao thu vao giup minh voi nhe.

Thank!
 
Upvote 0
Mình muốn thử làm, bạn điền thêm chút dữ liệu nữa để mình xem qua cách làm của bên đó cho nó sát.
 
Upvote 0
Xin chào mọi người!

Em có 1 bài toán về tham chiếu lập trình trong excel, nhưng do kiến thức còn hạn chế nên em rất mong mọi người xem và giúp đỡ ạ.

Em có gửi file đính kèm mô tả qua về 1 dạng tham chiếu mà em đang muốn xin giúp đỡ ạ. Em xin trình bày trong File như sau :

- Trong file có 2 bang. Bảng " Des " và bang " Origin ". Và các items trong bang " Des " sẽ được tham chiếu từ bang " Origin " ạ.

- Trong bang " Des " thì Item " Keo " sẽ đc tham chiếu lấy giá trị từ Item " A " trong bang " Origin "
Item " But " sẽ là tham chiếu là tổng của 2 item " B " & " C " trong bang " Origin "
Item " Muc " sẽ là tham chiếu của item " D " trong bang " Origin ". Nhưng là tham chiếu của D 1 ngày trước ó. Ví du : " Muc " ngày 15/3 sẽ là " D " của ngày 14/3.

Trong file ở bang " Des " em có input vài giá trị để mọi người xem qua ạ.

Trong file chính của em thì file data rất nhiều cột và hang ạ. Nên em gửi file mô tả bài toán same same như đính kèm ạ.

Rất mong các thầy và mọi người giúp em lập trình VBA để giải quyết bài toán này ạ.

Em xin trân trọng cảm ơn!
bạn nên đọc nội qui của diễn đàn
Mã:
Sub Button1_Click()
Dim Dic As Object, Sarr(), Darr(), Arr(), Tmp As String, i As Long, j As Long
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("B5:O12").Value
Darr = Range("C19:H28").Value
ReDim Arr(1 To UBound(Sarr) - 1, 1 To 1)
Application.ScreenUpdating = False
For i = 2 To UBound(Darr)
  For j = 3 To UBound(Darr, 2)
    Tmp = Darr(i, 1) & "#" & Darr(i, 2) & "#" & Darr(1, j)
    Dic.Item(Tmp) = Darr(i, j)
  Next j
Next i
For j = 3 To UBound(Sarr, 2) Step 3
  For i = 2 To UBound(Sarr)
    If Sarr(i, 1) <> "" Then
      If Sarr(i, 2) = "Keo" Then
        Tmp = Sarr(i, 1) & "#" & Darr(2, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      ElseIf Sarr(i, 2) = "But" Then
        Tmp = Sarr(i, 1) & "#" & Darr(3, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
        Tmp = Sarr(i, 1) & "#" & Darr(4, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Arr(i - 1, 1) + Dic.Item(Tmp)
      ElseIf j > 3 Then
        Tmp = Sarr(i, 1) & "#" & Darr(5, 2) & "#" & Sarr(1, j - 3)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      End If
    End If
  Next i
  Cells(6, j + 1).Resize(UBound(Arr)) = Arr
Next j
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Nhiều từ tiếng Việt còn phải mượn, ngay cả office cũng toàn tiếng Anh, vậy mà các bạn lại bắt bẻ vài chữ chủ thớt cho vào để dễ diễn đạt. VD câu này
Và các items trong bang " Des " sẽ được tham chiếu từ bang " Origin " ạ.
nếu không bắt lỗi "bang" thì từ item, chẳng lẽ dịch thành "hạng mục" hay "thông số" ...

anyway, thanks HieuCD đã giúp bạn ấy. vì thấy chủ thớt kêu gào từ hôm trước mà chả ai giúp.
 
Upvote 0
Nhiều từ tiếng Việt còn phải mượn, ngay cả office cũng toàn tiếng Anh, vậy mà các bạn lại bắt bẻ vài chữ chủ thớt cho vào để dễ diễn đạt. VD câu này
Và các items trong bang " Des " sẽ được tham chiếu từ bang " Origin " ạ.
nếu không bắt lỗi "bang" thì từ item, chẳng lẽ dịch thành "hạng mục" hay "thông số" ...

anyway, thanks HieuCD đã giúp bạn ấy. vì thấy chủ thớt kêu gào từ hôm trước mà chả ai giúp.

Tài khôn xen vào cũng bắt bẻ tầm bậy. Ai cũng biết từ khó diễn đạt bằng tiếng Việt thì dùng tiếng ngoại cũng chả sao.

Và quan trọng hơn hết, người ta nhắc nhở chủ ý chủ thớt nội quy ở hai điểm:
1. dùng tiếng Việt có dấu
2. tránh kêu gào, lặp đi lặp lại.

Mượn chó mắng mèo thì cũng nên lựa chỗ, lựa người cho chính xác. Mắng mỏ tầm bậy rồi làm bộ thanh với thiếc.

Chú: Về vấn đề tiếng ngoại thì xem cái này (tôi chỉ nêu ra thôi chứ không phải là cái các bạn kia muốn nói):
<quote>Trong file chính của em thì file data rất nhiều cột và hang ạ. Nên em gửi file mô tả bài toán same same như đính kèm ạ.<unquote>
Đọc câu trên mà không phân biệt được từ nào dùng tiếng ngoại ở chỗ không nên dùng thì nên học lại cả 2 ngôn ngữ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình muốn thử làm, bạn điền thêm chút dữ liệu nữa để mình xem qua cách làm của bên đó cho nó sát.
Rất cảm ơn bạn đã ghé thăm :)

Mình gửi lại file nhé. Trong File mình đã input them data vào các ngày 15/3, 16/3 lên bang " Des ", còn bình thường là mình đang mong muốn sau khi ấn nút thì data trên bang " Des " đc tham chiếu giá trị từ bang " origin " bên dưới.

Data đc tham chiếu như thế nào, bạn vui long xem lại giúp mình phần mở đầu phía trên mình có viết nhé.

Cảm ơn bạn rất nhiều!
 

File đính kèm

Upvote 0
bạn nên đọc nội qui của diễn đàn
Mã:
Sub Button1_Click()
Dim Dic As Object, Sarr(), Darr(), Arr(), Tmp As String, i As Long, j As Long
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("B5:O12").Value
Darr = Range("C19:H28").Value
ReDim Arr(1 To UBound(Sarr) - 1, 1 To 1)
Application.ScreenUpdating = False
For i = 2 To UBound(Darr)
  For j = 3 To UBound(Darr, 2)
    Tmp = Darr(i, 1) & "#" & Darr(i, 2) & "#" & Darr(1, j)
    Dic.Item(Tmp) = Darr(i, j)
  Next j
Next i
For j = 3 To UBound(Sarr, 2) Step 3
  For i = 2 To UBound(Sarr)
    If Sarr(i, 1) <> "" Then
      If Sarr(i, 2) = "Keo" Then
        Tmp = Sarr(i, 1) & "#" & Darr(2, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      ElseIf Sarr(i, 2) = "But" Then
        Tmp = Sarr(i, 1) & "#" & Darr(3, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
        Tmp = Sarr(i, 1) & "#" & Darr(4, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Arr(i - 1, 1) + Dic.Item(Tmp)
      ElseIf j > 3 Then
        Tmp = Sarr(i, 1) & "#" & Darr(5, 2) & "#" & Sarr(1, j - 3)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      End If
    End If
  Next i
  Cells(6, j + 1).Resize(UBound(Arr)) = Arr
Next j
Application.ScreenUpdating = True
End Sub
Quả Thật rất chính xác. Mình xin chân thành cảm ơn bạn đã bỏ thời gian giúp mình giải quyết bài toán này.

Mình cũng xin gửi lời cảm ơn tới tất cả các bạn đã quan tâm đến bài viết.

Cảm ơn " AnhdepZaj " và các Anh/Em khác rất nhiều.

Từ lần tới mình sẽ cẩn thận và chú ý hơn khi post bài!

Trân trọng!
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin lỗi do chỉnh sửa bài viết nhưng update nhầm, thành ra thừa ạ!
 
Upvote 0
bạn nên đọc nội qui của diễn đàn
Mã:
Sub Button1_Click()
Dim Dic As Object, Sarr(), Darr(), Arr(), Tmp As String, i As Long, j As Long
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("B5:O12").Value
Darr = Range("C19:H28").Value
ReDim Arr(1 To UBound(Sarr) - 1, 1 To 1)
Application.ScreenUpdating = False
For i = 2 To UBound(Darr)
  For j = 3 To UBound(Darr, 2)
    Tmp = Darr(i, 1) & "#" & Darr(i, 2) & "#" & Darr(1, j)
    Dic.Item(Tmp) = Darr(i, j)
  Next j
Next i
For j = 3 To UBound(Sarr, 2) Step 3
  For i = 2 To UBound(Sarr)
    If Sarr(i, 1) <> "" Then
      If Sarr(i, 2) = "Keo" Then
        Tmp = Sarr(i, 1) & "#" & Darr(2, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      ElseIf Sarr(i, 2) = "But" Then
        Tmp = Sarr(i, 1) & "#" & Darr(3, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
        Tmp = Sarr(i, 1) & "#" & Darr(4, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Arr(i - 1, 1) + Dic.Item(Tmp)
      ElseIf j > 3 Then
        Tmp = Sarr(i, 1) & "#" & Darr(5, 2) & "#" & Sarr(1, j - 3)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      End If
    End If
  Next i
  Cells(6, j + 1).Resize(UBound(Arr)) = Arr
Next j
Application.ScreenUpdating = True
End Sub

Gửi bạn HieuCD.

Quả that Code của bạn rất hay, nhưng nhìn vào thấy that sự khó hiểu do kiến thức VBA của mình còn hạn chế quá.

Rất mong bạn vui long hỗ trợ mình 1 lần, có thể comment giải thích giúp từng dòng một ngắn gọn đc không bạn ? Mình vừa nhìn và vừa học sẽ dễ hiểu hơn để có thể tự làm trên chính File của mình ( do file của mình data rất nặng và cực rắc rối ).

hơn nữa Code của bạn tham chiếu trong file mình gửi là tham chiếu theo cả hang và cột, còn trong file chính của mình thì hang cột nó linh tinh lắm nên chỉ tham chiếu đc theo Mã ( ví dụ : Kẹo tham chiều từ A, But tham chiều là tổng của B và C ) chứ k tham chiếu theo cột cố định như trong code của bạn.

Nếu tham chiếu đc theo Mã, Tên thì hay quá... Bạn có thể giúp mình đc k?


Mình cảm ơn bạn rất nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Gửi bạn HieuCD.

Quả that Code của bạn rất hay, nhưng nhìn vào thấy that sự khó hiểu do kiến thức VBA của mình còn hạn chế quá.

Rất mong bạn vui long hỗ trợ mình 1 lần, có thể comment giải thích giúp từng dòng một ngắn gọn đc không bạn ? Mình vừa nhìn và vừa học sẽ dễ hiểu hơn để có thể tự làm trên chính File của mình ( do file của mình data rất nặng và cực rắc rối ).

hơn nữa Code của bạn tham chiếu trong file mình gửi là tham chiếu theo cả hang và cột, còn trong file chính của mình thì hang cột nó linh tinh lắm nên chỉ tham chiếu đc theo Mã ( ví dụ : Kẹo tham chiều từ A, But tham chiều là tổng của B và C ) chứ k tham chiếu theo cột cố định như trong code của bạn.

Nếu tham chiếu đc theo Mã, Tên thì hay quá... Bạn có thể giúp mình đc k?


Mình cảm ơn bạn rất nhiều!
mình dùng Dictionary để tham chiếu đến từng mã, bạn xem ghi chú trong code và chỉnh lại theo file thực tế, nếu không làm được thì gởi file với các vùng dữ liệu sát thực tế, còn dữ liệu cho ví dụ thôi
Mã:
Sub Button1_Click()
Dim Dic As Object, Sarr(), Darr(), Arr(), Tmp As String, i As Long, j As Long
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("B5:O12").Value  'Bang dieu kien lay ket qua
Darr = Range("C19:H28").Value 'Bang du lieu
ReDim Arr(1 To UBound(Sarr) - 1, 1 To 1) 'Ket qua cua 1 cot theo tung ngay
Application.ScreenUpdating = False
'gán giá tri tìm kiem vào Dic
For i = 2 To UBound(Darr) 'vùng giá tri bat dau o dòng thu 2
  For j = 3 To UBound(Darr, 2)  'vùng giá tri bat dau o cot thu 3
    Tmp = Darr(i, 1) & "#" & Darr(i, 2) & "#" & Darr(1, j)  ' tao Key, là dieu kien tìm giá tri
    Dic.Item(Tmp) = Darr(i, j)  'gán Item, là giá tri can lay o bang ket qua
  Next j
Next i
'gán ket qua vào tung cot, bat dau là cot thu 3, cot ke cách 3 cot trong bang Sarr
For j = 3 To UBound(Sarr, 2) Step 3
  For i = 2 To UBound(Sarr) 'dong dau gan ket qua là dòng 2 trong bang Sarr
    If Sarr(i, 1) <> "" Then
      If Sarr(i, 2) = "Keo" Then 'neu là "Keo" thì chuyen thành "A"=Darr(22)
        Tmp = Sarr(i, 1) & "#" & Darr(2, 2) & "#" & Sarr(1, j) 'tao Key cua Dic
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      ElseIf Sarr(i, 2) = "But" Then '"B"=Darr(3,2), "C"=Darr(4,2)
        Tmp = Sarr(i, 1) & "#" & Darr(3, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
        Tmp = Sarr(i, 1) & "#" & Darr(4, 2) & "#" & Sarr(1, j)
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Arr(i - 1, 1) + Dic.Item(Tmp)
      ElseIf j > 3 Then ' khong tính cot dau tien, "D"=Darr(5,2)
        Tmp = Sarr(i, 1) & "#" & Darr(5, 2) & "#" & Sarr(1, j - 3) 'j-3 là lùi lai 3 cot, lay truoc do 1 ngay
        If Dic.exists(Tmp) Then Arr(i - 1, 1) = Dic.Item(Tmp)
      End If
    End If
  Next i
  Cells(6, j + 1).Resize(UBound(Arr)) = Arr 'gán ket qua vao tung cot, cot dau tien là cot "D" là cot thu 4=j+1 voi j=3
Next j
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom