Giúp hướng dẫn cách tư duy viết code VBA để giải quyết bài toán

Liên hệ QC

hic1802

Thành viên tiêu biểu
Tham gia
16/2/13
Bài viết
545
Được thích
34
Giới tính
Nam
Xin chào mọi người trên GPE,
Hôm nay mình có 2 bài toán nhờ mọi người giúp đỡ để xử lý (có thể dùng công thức excel hoặc VBA)
Mình có bảng phân công cv cho từng nhân viên, trong bảng này mình có mã hóa NV và CV (sheet "DSCV" và "DSNV")
hàng ngày mình sẽ phân công công việc cho nhân viên bằng cách tích "x" vào các cột CV trong sheet "MaTranCV" (ví dụ : tích "x" vào cột CV1 tức là phân công CV1 cho người đó làm)
sau khi phân công xong thì mình muốn dữ liệu sẽ được chuyển sang sheet "NoiDung" dựa theo ngày và mã công việc đã tích ở sheet "MaTranCV" , tên CV sẽ đc vlookup từ dữ liệu sheet "DSCV".
Mình nhờ mọi người giúp em 2 vấn đề :
1, Yêu cầu 1 : giúp hiển thị được giá trị vào cột F trong sheet "DSNV" : cột này được lấy dữ liệu từ sheet "DSCV" , bao gồm : mã CV : số điền vào ô mã CV, đối với các mã CV để trống thì không hiển thị nội dung (như trong file gửi đính kèm)
2, Tạo code VBA khi chạy lệnh thì sẽ chuyển đổi từ Ma trận CV sang Nội dung CV (chuyển đổi từ sheet "MaTranCV" sang "NoiDung" theo mẫu form em đã gửi trong file đính kèm.
Hoặc hướng dẫn tôi cách tư duy để có thể giải 2 vấn đề trên.
Mình xin chân thành cảm ơn.
 

File đính kèm

  • PhanCongCongViecMoi.xlsm
    23.7 KB · Đọc: 13
Hướng dẫn tư duy:
Đầu tiên hết là cho biết 2 vấn đề trên có liên quan với nhau hay không. Và:
1. nếu không liên quan thì cái nào quan trọng hơn, cần thực hiện trước
2. nếu có liên quan thì hai cái đó có thể gôppj lại thành 1? nếu khong thì cái nào phải xảy ra trước cái nào?
 
Xin chào mọi người trên GPE,
Hôm nay mình có 2 bài toán nhờ mọi người giúp đỡ để xử lý (có thể dùng công thức excel hoặc VBA)
Mình có bảng phân công cv cho từng nhân viên, trong bảng này mình có mã hóa NV và CV (sheet "DSCV" và "DSNV")
hàng ngày mình sẽ phân công công việc cho nhân viên bằng cách tích "x" vào các cột CV trong sheet "MaTranCV" (ví dụ : tích "x" vào cột CV1 tức là phân công CV1 cho người đó làm)
sau khi phân công xong thì mình muốn dữ liệu sẽ được chuyển sang sheet "NoiDung" dựa theo ngày và mã công việc đã tích ở sheet "MaTranCV" , tên CV sẽ đc vlookup từ dữ liệu sheet "DSCV".
Mình nhờ mọi người giúp em 2 vấn đề :
1, Yêu cầu 1 : giúp hiển thị được giá trị vào cột F trong sheet "DSNV" : cột này được lấy dữ liệu từ sheet "DSCV" , bao gồm : mã CV : số điền vào ô mã CV, đối với các mã CV để trống thì không hiển thị nội dung (như trong file gửi đính kèm)
2, Tạo code VBA khi chạy lệnh thì sẽ chuyển đổi từ Ma trận CV sang Nội dung CV (chuyển đổi từ sheet "MaTranCV" sang "NoiDung" theo mẫu form em đã gửi trong file đính kèm.
Hoặc hướng dẫn tôi cách tư duy để có thể giải 2 vấn đề trên.
Mình xin chân thành cảm ơn.
theo wiki thì:

Tư duy là phạm trù triết học dùng để chỉ những hoạt động của tinh thần, đem những cảm giác của người ta sửa đổi và cải tạo thế giới thông qua hoạt động vật chất, làm cho người ta có nhận thức đúng đắn về sự vật và ứng xử tích cực với nó.
Theo Từ điển Bách khoa toàn thư Việt Nam, tập 4 (Nhà xuất bản Từ điển bách khoa. Hà Nội. 2005); Tư duy là sản phẩm cao nhất của vật chất được tổ chức một cách đặc biệt – bộ não con người. Tư duy phản ánh tích cực hiện thực khách quan dưới dạng các khái niệm, sự phán đoán, lý luận.v.v...
Theo triết học duy tâm khách quan, tư duy là sản phẩm của "ý niệm tuyệt đối" với tư cách là bản năng siêu tự nhiên, độc lập, không phụ thuộc vào vật chất. Theo George Wilhemer Fridrick Heghen: "Ý niệm tuyệt đối là bản nguyên của hoạt động và nó chỉ có thể biểu hiện trong tư duy, trong nhận thức tư biện mà thôi".[1]. Karl Marx nhận xét: "Đối với Heghen, vận động của tư duy được ông nhân cách hóa dưới tên gọi "ý niệm" là chúa sáng tạo ra hiện thực; hiện thực chỉ là hình thức bề ngoài của ý niệm".[2]
Theo triết học duy vật biện chứng, tư duy là một trong các đặc tính của vật chất phát triển đến trình độ tổ chức cao. Về lý thuyết, Karl Marx cho rằng: "Vận động kiểu tư duy chỉ là sự vận động của hiện thực khách quan được di chuyển vào và được cải tạo/tái tạo trong đầu óc con người dưới dạng một sự phản ánh".[3] Những luận cứ này còn dựa trên những nghiên cứu thực nghiệm của Ivan Petrovich Pavlov, nhà sinh lý học, nhà tư tưởng người Nga. Bằng các thí nghiệm tâm-sinh lý áp dụng trên động vật và con người, ông đi đến kết luận: "Hoạt động tâm lý là kết quả của hoạt động sinh lý của một bộ phận nhất định của bộ óc".[4]

Vậy tư duy VBA thì sao? bạn tự tìm câu trả lời vậy
Vì thấy tư duy - là vấn đề to và riêng cho từng người quá, nên CHẠY
 
Hướng dẫn tư duy:
Đầu tiên hết là cho biết 2 vấn đề trên có liên quan với nhau hay không. Và:
1. nếu không liên quan thì cái nào quan trọng hơn, cần thực hiện trước
2. nếu có liên quan thì hai cái đó có thể gôppj lại thành 1? nếu khong thì cái nào phải xảy ra trước cái nào?
chào bác,
2 vấn đề này là riêng biệt nhưng giải quyết chung 1 mục đích (để quản lý tốt CV + NV)
vấn đề 1 xử lý trước sau đó đến vấn đề 2.
Mong được bác tư vấn thêm.
 
theo wiki thì:

Tư duy là phạm trù triết học dùng để chỉ những hoạt động của tinh thần, đem những cảm giác của người ta sửa đổi và cải tạo thế giới thông qua hoạt động vật chất, làm cho người ta có nhận thức đúng đắn về sự vật và ứng xử tích cực với nó.
Theo Từ điển Bách khoa toàn thư Việt Nam, tập 4 (Nhà xuất bản Từ điển bách khoa. Hà Nội. 2005); Tư duy là sản phẩm cao nhất của vật chất được tổ chức một cách đặc biệt – bộ não con người. Tư duy phản ánh tích cực hiện thực khách quan dưới dạng các khái niệm, sự phán đoán, lý luận.v.v...
Theo triết học duy tâm khách quan, tư duy là sản phẩm của "ý niệm tuyệt đối" với tư cách là bản năng siêu tự nhiên, độc lập, không phụ thuộc vào vật chất. Theo George Wilhemer Fridrick Heghen: "Ý niệm tuyệt đối là bản nguyên của hoạt động và nó chỉ có thể biểu hiện trong tư duy, trong nhận thức tư biện mà thôi".[1]. Karl Marx nhận xét: "Đối với Heghen, vận động của tư duy được ông nhân cách hóa dưới tên gọi "ý niệm" là chúa sáng tạo ra hiện thực; hiện thực chỉ là hình thức bề ngoài của ý niệm".[2]
Theo triết học duy vật biện chứng, tư duy là một trong các đặc tính của vật chất phát triển đến trình độ tổ chức cao. Về lý thuyết, Karl Marx cho rằng: "Vận động kiểu tư duy chỉ là sự vận động của hiện thực khách quan được di chuyển vào và được cải tạo/tái tạo trong đầu óc con người dưới dạng một sự phản ánh".[3] Những luận cứ này còn dựa trên những nghiên cứu thực nghiệm của Ivan Petrovich Pavlov, nhà sinh lý học, nhà tư tưởng người Nga. Bằng các thí nghiệm tâm-sinh lý áp dụng trên động vật và con người, ông đi đến kết luận: "Hoạt động tâm lý là kết quả của hoạt động sinh lý của một bộ phận nhất định của bộ óc".[4]

Vậy tư duy VBA thì sao? bạn tự tìm câu trả lời vậy
Vì thấy tư duy - là vấn đề to và riêng cho từng người quá, nên CHẠY
Cảm ơn bác đã góp ý.
Bác có cách gì xử lý được 2 vấn đề của em không?
 
Mần 1 cái, nếu thấy được thì tiếp: Xài phương thức cùi bắp nhất: FIND()
Cảm ơn bác, đúng rồi a, có điều bác có thể chỉnh sau dấu : là số luôn đc ko, hiện tại đang có dấu cách
Nhờ bác giúp đỡ tiếp yêu cầu 2 ạ
 
Lần chỉnh sửa cuối:
Xin chào mọi người trên GPE,
Hôm nay mình có 2 bài toán nhờ mọi người giúp đỡ để xử lý (có thể dùng công thức excel hoặc VBA)
Mình có bảng phân công cv cho từng nhân viên, trong bảng này mình có mã hóa NV và CV (sheet "DSCV" và "DSNV")
hàng ngày mình sẽ phân công công việc cho nhân viên bằng cách tích "x" vào các cột CV trong sheet "MaTranCV" (ví dụ : tích "x" vào cột CV1 tức là phân công CV1 cho người đó làm)
sau khi phân công xong thì mình muốn dữ liệu sẽ được chuyển sang sheet "NoiDung" dựa theo ngày và mã công việc đã tích ở sheet "MaTranCV" , tên CV sẽ đc vlookup từ dữ liệu sheet "DSCV".
Mình nhờ mọi người giúp em 2 vấn đề :
1, Yêu cầu 1 : giúp hiển thị được giá trị vào cột F trong sheet "DSNV" : cột này được lấy dữ liệu từ sheet "DSCV" , bao gồm : mã CV : số điền vào ô mã CV, đối với các mã CV để trống thì không hiển thị nội dung (như trong file gửi đính kèm)
2, Tạo code VBA khi chạy lệnh thì sẽ chuyển đổi từ Ma trận CV sang Nội dung CV (chuyển đổi từ sheet "MaTranCV" sang "NoiDung" theo mẫu form em đã gửi trong file đính kèm.
Hoặc hướng dẫn tôi cách tư duy để có thể giải 2 vấn đề trên.
Mình xin chân thành cảm ơn.
Bạn xem code để hiểu cách xử lý
Mã:
Sub ABC()
  Dim sArr(), dArr(), Res(), Dic As Object, iKey As String
  Dim i As Long, j As Long, k As Long, ik As Long
  Dim eRow As Long, sR As Long, sR2 As Long, sC2 As Long
 
  With Sheets("DSNV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then MsgBox ("Khong co Ma NV"): Exit Sub
    dArr = .Range("B2:C" & eRow).Value 'Mang Ma NV
  End With
 
  With Sheets("DSCV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co Ma NV"): Exit Sub
    sArr = .Range("B2:N" & eRow).Value 'Mang Cong Ciec
  End With
 
  Set Dic = CreateObject("Scripting.dictionary")
  sR = UBound(dArr)
  ReDim Res(1 To sR, 1 To 1) 'Mang Ket Qua
  For i = 1 To sR
    iKey = dArr(i, 1) 'Ma NV
    If Len(iKey) Then Dic.Item(iKey) = i
  Next i
 
  sR2 = UBound(sArr): sC2 = UBound(sArr, 2)
  For j = 4 To sC2 'Duyet cac cot Ma NV
    iKey = sArr(1, j) 'Ma NV
    ik = Dic.Item(iKey) ' Thu tu dong ket qua
    If ik > 0 Then
      For i = 2 To sR2 'Duyet cac dong Ma CV
        If sArr(i, j) > 0 Then
          Res(ik, 1) = Res(ik, 1) & ";" & sArr(i, 1) & ":" & sArr(i, j)
        End If
      Next i
    End If
    Res(ik, 1) = Mid(Res(ik, 1), 2, Len(Res(ik, 1)) - 1)
  Next j
 
  With Sheets("DSNV")
    .Range("F2").Resize(sR).Value = Res 'Gan Ket qua
  End With
  Set Dic = Nothing
End Sub

Sub ABCDEF()
  Dim sArr(), Res(), Ngay As Date, NV As String
  Dim i As Long, j As Long, k As Long, sk As Long
  Dim eRow As Long, sR As Long, sC As Long
 
  With Sheets("MaTranCV")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co Ma NV"): Exit Sub
    sArr = .Range("A2:AG" & eRow).Value 'Mang Cong Ciec
    sk = Application.CountIf(.Range("D3:AG" & eRow), "X") 'So O danh dau "X"
    Ngay = .Range("A1").Value
  End With
  ReDim Res(1 To sk, 1 To 5) 'Mang Ket Qua

  sR = UBound(sArr): sC = UBound(sArr, 2)
  For i = 2 To sR
    NV = sArr(i, 1) 'Ma NV
    If Len(NV) > 0 Then
      For j = 4 To sC
        If UCase(sArr(i, j)) = "X" Then
          k = k + 1 'Dong ket qua
          Res(k, 1) = k
          Res(k, 2) = Ngay
          Res(k, 3) = sArr(i, 2)
          Res(k, 4) = sArr(1, j)
          Res(k, 5) = Replace(Res(k, 4), "CV", "Thuc hien cong viec ", 1) 'Dau tieng Viet tu viet code
        End If
      Next j
    End If
  Next i
 
  With Sheets("NoiDung")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 2 Then .Range("A3:L" & eRow).Clear
    If k Then
      .Range("A3").Resize(k, 5).Value = Res 'Gan Ket qua
      .Range("A3:L3").Resize(k).Borders.LineStyle = 1
    End If
  End With
End Sub
 
(1) Cảm ơn bác, đúng rồi a, có điều bác có thể chỉnh sau dấu : là số luôn đc ko, hiện tại đang có dấu cách
(2) Nhờ bác giúp đỡ tiếp yêu cầu 2 ạ

(1) Bạn chép cái này đè lên dòng lệnh cũ:
Mã:
MyStr = MyStr & Sh.Cells(Cll.Row, "B").Value & HC & CStr(Cll.Value) & "; "
Nếu thay dòng lệnh này vô dòng gần cuối thì đẹp hơn nè:
PHP:
Cells(Cls.Row, "F").Value = Left$(MyStr, Len(MyStr) - 2):    MyStr = Space(0)

(2) Bạn đã được giúp 1 macro xịn rồi đó thôi & chúc vui!
 
Rốt cuộc lại thì mình có thấy tư duy chỗ nào đâu.
Hay là thời đại thập niên 10's của thế kỷ 21, từ "tư duy" nó thay đổi ý nghĩa rồi nhỉ. Chắc phải trở lại trường học lại môn "ngôn ngữ và thời đại"
 
Bạn xem code để hiểu cách xử lý
Mã:
Sub ABC()
  Dim sArr(), dArr(), Res(), Dic As Object, iKey As String
  Dim i As Long, j As Long, k As Long, ik As Long
  Dim eRow As Long, sR As Long, sR2 As Long, sC2 As Long

  With Sheets("DSNV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then MsgBox ("Khong co Ma NV"): Exit Sub
    dArr = .Range("B2:C" & eRow).Value 'Mang Ma NV
  End With

  With Sheets("DSCV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co Ma NV"): Exit Sub
    sArr = .Range("B2:N" & eRow).Value 'Mang Cong Ciec
  End With

  Set Dic = CreateObject("Scripting.dictionary")
  sR = UBound(dArr)
  ReDim Res(1 To sR, 1 To 1) 'Mang Ket Qua
  For i = 1 To sR
    iKey = dArr(i, 1) 'Ma NV
    If Len(iKey) Then Dic.Item(iKey) = i
  Next i

  sR2 = UBound(sArr): sC2 = UBound(sArr, 2)
  For j = 4 To sC2 'Duyet cac cot Ma NV
    iKey = sArr(1, j) 'Ma NV
    ik = Dic.Item(iKey) ' Thu tu dong ket qua
    If ik > 0 Then
      For i = 2 To sR2 'Duyet cac dong Ma CV
        If sArr(i, j) > 0 Then
          Res(ik, 1) = Res(ik, 1) & ";" & sArr(i, 1) & ":" & sArr(i, j)
        End If
      Next i
    End If
    Res(ik, 1) = Mid(Res(ik, 1), 2, Len(Res(ik, 1)) - 1)
  Next j

  With Sheets("DSNV")
    .Range("F2").Resize(sR).Value = Res 'Gan Ket qua
  End With
  Set Dic = Nothing
End Sub

Sub ABCDEF()
  Dim sArr(), Res(), Ngay As Date, NV As String
  Dim i As Long, j As Long, k As Long, sk As Long
  Dim eRow As Long, sR As Long, sC As Long

  With Sheets("MaTranCV")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co Ma NV"): Exit Sub
    sArr = .Range("A2:AG" & eRow).Value 'Mang Cong Ciec
    sk = Application.CountIf(.Range("D3:AG" & eRow), "X") 'So O danh dau "X"
    Ngay = .Range("A1").Value
  End With
  ReDim Res(1 To sk, 1 To 5) 'Mang Ket Qua

  sR = UBound(sArr): sC = UBound(sArr, 2)
  For i = 2 To sR
    NV = sArr(i, 1) 'Ma NV
    If Len(NV) > 0 Then
      For j = 4 To sC
        If UCase(sArr(i, j)) = "X" Then
          k = k + 1 'Dong ket qua
          Res(k, 1) = k
          Res(k, 2) = Ngay
          Res(k, 3) = sArr(i, 2)
          Res(k, 4) = sArr(1, j)
          Res(k, 5) = Replace(Res(k, 4), "CV", "Thuc hien cong viec ", 1) 'Dau tieng Viet tu viet code
        End If
      Next j
    End If
  Next i

  With Sheets("NoiDung")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 2 Then .Range("A3:L" & eRow).Clear
    If k Then
      .Range("A3").Resize(k, 5).Value = Res 'Gan Ket qua
      .Range("A3:L3").Resize(k).Borders.LineStyle = 1
    End If
  End With
End Sub

bác @HieuCD ơi, code chạy chuẩn luôn rồi ạ, có điều ở code thứ 2 thì khi chuyển dữ liệu sang bên sheets "NoiDung" thì cột ngày sẽ hiển thị sang giá trị (dạng kiểu số) chứ không phải định dạng "dd/mm/yyyy" , có cách gì ko ạ??? hay là thêm code định dạng lại cho dòng đó?
Bài đã được tự động gộp:

Rốt cuộc lại thì mình có thấy tư duy chỗ nào đâu.
Hay là thời đại thập niên 10's của thế kỷ 21, từ "tư duy" nó thay đổi ý nghĩa rồi nhỉ. Chắc phải trở lại trường học lại môn "ngôn ngữ và thời đại"
Em thường coi mỗi người có 1 cách nhận thức khác nhau thì sẽ có cách nghĩ khác nhau, đối với em để giải quyết bài toán mình đang gặp phải thì e phải tư duy để tìm ra phương pháp, đối với bác thì đã có cách làm rồi thì sẽ không cần tư duy nữa cứ thế tòn tòn mà làm thôi. Tư duy đối với em là suy nghĩ để tìm ra được phương pháp xử lý vấn đề, có thể đó là nhận thức sai thì xin được giải ngố vậy :D :D :D
 
Nếu gọi là "phương pháp" thì phải là vài lới chỉ dẫn, phần code là tự làm.
Ở đây code xong sẵn rồi, chỉ cần sửa đổi một chút cho phù hợp mà còn hỏi tới hỏi lui. Chẳng phải là định nghĩa "tư duy" theo thời đại hay sao?
 
(1) Bạn chép cái này đè lên dòng lệnh cũ:
Mã:
MyStr = MyStr & Sh.Cells(Cll.Row, "B").Value & HC & CStr(Cll.Value) & "; "
Nếu thay dòng lệnh này vô dòng gần cuối thì đẹp hơn nè:
PHP:
Cells(Cls.Row, "F").Value = Left$(MyStr, Len(MyStr) - 2):    MyStr = Space(0)

(2) Bạn đã được giúp 1 macro xịn rồi đó thôi & chúc vui!
Cảm ơn bác nhiều, bác xem lại hộ e dòng code này
Cells(Cls.Row, "F").Value = Left$(MyStr, Len(MyStr) - 2): MyStr = Space(0)
em copy vào thay dòng code cũ
Cells(Cls.Row, "F").Value = MyStr: MyStr = ""
thì khi chạy nó báo lỗi tại dòng thay thế trên
Bài đã được tự động gộp:

Nếu gọi là "phương pháp" thì phải là vài lới chỉ dẫn, phần code là tự làm.
Ở đây code xong sẵn rồi, chỉ cần sửa đổi một chút cho phù hợp mà còn hỏi tới hỏi lui. Chẳng phải là định nghĩa "tư duy" theo thời đại hay sao?
cảm ơn bác đã chỉ điểm lần sau em xin được suy nghĩ 10 lần trước khi viết.
ps: em không biết về code VBA (dân ngoại đạo code)
 
Lần chỉnh sửa cuối:
bác @HieuCD ơi, code chạy chuẩn luôn rồi ạ, có điều ở code thứ 2 thì khi chuyển dữ liệu sang bên sheets "NoiDung" thì cột ngày sẽ hiển thị sang giá trị (dạng kiểu số) chứ không phải định dạng "dd/mm/yyyy" , có cách gì ko ạ??? hay là thêm code định dạng lại cho dòng đó?
Bài đã được tự động gộp:


Em thường coi mỗi người có 1 cách nhận thức khác nhau thì sẽ có cách nghĩ khác nhau, đối với em để giải quyết bài toán mình đang gặp phải thì e phải tư duy để tìm ra phương pháp, đối với bác thì đã có cách làm rồi thì sẽ không cần tư duy nữa cứ thế tòn tòn mà làm thôi. Tư duy đối với em là suy nghĩ để tìm ra được phương pháp xử lý vấn đề, có thể đó là nhận thức sai thì xin được giải ngố vậy :D :D :D
Trước dòng lệnh: ".Range("A3").Resize(k, 5).Value = Res 'Gan Ket qua"
Bạn thêm lệnh NumberFormat cho cột ngày
 
Dòng báo lỗi như bạn nói có 2 câu lệnh; (/ậy nó báo lỗi câu trước hay câu sau vậy bạn?
Đừng nói là báo lỗi cả hai đó nha!
 
Web KT
Back
Top Bottom