[Nhờ giúp đỡ] chuyển dữ liệu sang một kiểu form khác?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,213
Xin chào các Bạn,
Như tiêu đề OT đã đề cập, với bài toán này OT chưa thực hiện được nên up nên đây nhờ các bạn xem & giúp đỡ ạ.
Với bài này OT muốn duyệt trên các cell ạ mà không cần sử dụng mảng ạ.
 

File đính kèm

  • Chuyen doi form.xlsx
    17.2 KB · Đọc: 28
Lần chỉnh sửa cuối:
Upvote 0
Có.
1. Tại sao không dùng mảng?
2. từ 22h đến 6 giờ sáng hôm sau là ca 3, tại sao kết quả ở ca 1

View attachment 261357
Con chào chú Mỹ,

Đúng rồi chú Mỹ chỗ đó con nhập bằng tay sai chú Mỹ ạ..hic

Dạ vì bài này con không cần dùng mảng vì con còn muốn kết hợp để tô màu kẻ khung và các vấn đề khác buộc phải xử lý trong trong quá trình duyệt từng ô chú Mỹ ạ.
 
Upvote 0
Nếu là đánh cược thì có chia không? mà dù chia hay không thì tôi cũng không tham gia
Bạn không thì tôi theo thử (cược theo chứ không cần chia). Nhưng tôi chỉ theo phần "duyệt trên các cell [sic]" thôi.

Duyệt cells cũng giống như mảng 2 chiều.
Nếu a là mảng 2 chiều a(1 To 10, 1 To 10) thì a(3, 4) là phần tử ở dòng thứ 3, cột 4 của mảng a
Nếu rg là chiếu vào một range thì rg.Cells(3, 4) là cell ở dòng thứ 3, cột thứ 4 của rg. Chú ý tiền tố ở đây là rg chứ khong phải sheet. Nếu rg là C5:L14 thì rg.Cells(3, 4) là F7.

Điểm khác giữa range và array trogn trường hợp này là hàm Range.Cells không bị lỗi vượt chỉ số.
Với ví dụ trên a(11, 1) sẽ bị lỗi vượt chỉ số, nhưng rg.Cells(11,1) không bị lỗi, nó trả về C15.
 
Upvote 0
Con chào chú Mỹ,

Đúng rồi chú Mỹ chỗ đó con nhập bằng tay sai chú Mỹ ạ..hic

Dạ vì bài này con không cần dùng mảng vì con còn muốn kết hợp để tô màu kẻ khung và các vấn đề khác buộc phải xử lý trong trong quá trình duyệt từng ô chú Mỹ ạ.
Tô màu kẻ khung không phải lý do chính đáng, không duyệt. "Các vấn đề khác" là gì kể ra luôn đi nào.
 
Upvote 0
Tô màu kẻ khung không phải lý do chính đáng, không duyệt. "Các vấn đề khác" là gì kể ra luôn đi nào.
Nếu là các mã hàng đặc biệt theo một danh sách cho sẵn thì phải tô màu mã đó Chú ạ.
Phải kết hợp trong qua trình đưa dữ liệu xuống từng ô nữa chú, dữ liệu cũng không có nhiều chú ạ.
Bài đã được tự động gộp:

Bạn không thì tôi theo thử (cược theo chứ không cần chia). Nhưng tôi chỉ theo phần "duyệt trên các cell [sic]" thôi.

Duyệt cells cũng giống như mảng 2 chiều.
Nếu a là mảng 2 chiều a(1 To 10, 1 To 10) thì a(3, 4) là phần tử ở dòng thứ 3, cột 4 của mảng a
Nếu rg là chiếu vào một range thì rg.Cells(3, 4) là cell ở dòng thứ 3, cột thứ 4 của rg. Chú ý tiền tố ở đây là rg chứ khong phải sheet. Nếu rg là C5:L14 thì rg.Cells(3, 4) là F7.

Điểm khác giữa range và array trogn trường hợp này là hàm Range.Cells không bị lỗi vượt chỉ số.
Với ví dụ trên a(11, 1) sẽ bị lỗi vượt chỉ số, nhưng rg.Cells(11,1) không bị lỗi, nó trả về C15.
Bác chỉ con thuật toán với ạ, con thử xem được không, con vướng cái khi ghép số vài chuỗi rồi thì không cộng tiếp vào được.
Con đang nghĩ đến đoạn này sẽ phải viết một hàm để xử lý riêng nhưng ngoài khả năng của con rồi bác ạ.
 
Upvote 0
Tô màu, điểm mã (*1) thì mấu chốt là cái hàm Union. Gom một đống lại rồi làm luôn một lượt.
Nhưng tôi chỉ có thể mách đến thế thôi. Tôi cũng ghét cái vụ màu mã lắm, không động tới cho nên cũng không rành.

(*1) từ mã ở đây là muốn nói cái dáng vẻ bề ngoài, không phải mã là ký số.
 
Upvote 0
Bạn không thì tôi theo thử (cược theo chứ không cần chia). Nhưng tôi chỉ theo phần "duyệt trên các cell [sic]" thôi.
Tôi chỉ đang doạ thôi. Ngoài ra còn phải xem hết "các vấn đề khác", chỉ để chỉnh sửa tư duy cho đối tượng, chứ làm trên cell có vấn đề gì đâu. Chỉ chậm 1 chút thôi.
 
Upvote 0
Xin chào các Bạn,
Như tiêu đề OT đã đề cập, với bài toán này OT chưa thực hiện được nên up nên đây nhờ các bạn xem & giúp đỡ ạ.
Với bài này OT muốn duyệt trên các cell ạ mà không cần sử dụng mảng ạ.
Cách trình bày kết quả có không thể hiện mối liên hệ giữa mã hàng và ca sản xuất, ví dụ mã hàng MH0011 sản xuất ca 3 nhưng ghi nhận ca 1
Mã:
Sub ABC()
  Dim rng As Range, S, fDay As Date, iDay As Date, iMonth&, maHang$
  Dim sRow&, fRow&, i&, r&, iR&

  With Sheets("Du_Lieu")
    Set rng = .Range("A2", .Range("E" & Rows.Count).End(xlUp))
    sRow = rng.Rows.Count
  End With
  With Sheets("Ket_Qua")
    fDay = .Range("F3").Value:   iMonth = Month(fDay)
    fRow = 6 'Dong tieu de
    r = fRow + Hour(rng(1, 3)) \ 6 + Int(rng(1, 3) - fDay) * 3
    .Range("E" & r & ":G102").ClearContents 'Xoa du lieu
    For i = 1 To sRow
      If Month(rng(i, 3)) = iMonth Then 'xet thang
        r = fRow + Hour(rng(i, 3)) \ 6 + Int(rng(i, 3) - fDay) * 3 'thu tu dong ket qua
        If .Cells(r, 5).Value = Empty Then 'So chung tu
          .Cells(r, 5).Value = rng(i, 1) & ":" & rng(i, 2)
        Else
          .Cells(r, 5).Value = .Cells(r, 5).Value & Chr(10) & rng(i, 1) & ":" & rng(i, 2)
        End If
        If maHang <> rng(i, 5).Value And iDay <> Int(rng(i, 3)) Then
            iR = r 'Dong ma hang
            iDay = Int(rng(i, 3)) 'Ngay
        End If
        If .Cells(iR, 6).Value = Empty Then
          .Cells(iR, 6).Value = rng(i, 5).Value
          .Cells(iR, 7).Value = rng(i, 2).Value
          maHang = rng(i, 5).Value
        Else
          If maHang <> rng(i, 5).Value Then  'Ma hang + so luong
            maHang = rng(i, 5).Value
            .Cells(iR, 6).Value = .Cells(iR, 6).Value & Chr(10) & maHang
            .Cells(iR, 7).Value = .Cells(iR, 7).Value & Chr(10) & rng(i, 2).Value
          Else
            S = Split(.Cells(iR, 7).Value, Chr(10))
            S(UBound(S)) = S(UBound(S)) + rng(i, 2).Value
            .Cells(iR, 7).Value = Join(S, Chr(10))
          End If
        End If
      End If
    Next i
  End With
End Sub
 
Upvote 0
Cách trình bày kết quả có không thể hiện mối liên hệ giữa mã hàng và ca sản xuất, ví dụ mã hàng MH0011 sản xuất ca 3 nhưng ghi nhận ca 1
Mã:
Sub ABC()
  Dim rng As Range, S, fDay As Date, iDay As Date, iMonth&, maHang$
  Dim sRow&, fRow&, i&, r&, iR&

  With Sheets("Du_Lieu")
    Set rng = .Range("A2", .Range("E" & Rows.Count).End(xlUp))
    sRow = rng.Rows.Count
  End With
  With Sheets("Ket_Qua")
    fDay = .Range("F3").Value:   iMonth = Month(fDay)
    fRow = 6 'Dong tieu de
    r = fRow + Hour(rng(1, 3)) \ 6 + Int(rng(1, 3) - fDay) * 3
    .Range("E" & r & ":G102").ClearContents 'Xoa du lieu
    For i = 1 To sRow
      If Month(rng(i, 3)) = iMonth Then 'xet thang
        r = fRow + Hour(rng(i, 3)) \ 6 + Int(rng(i, 3) - fDay) * 3 'thu tu dong ket qua
        If .Cells(r, 5).Value = Empty Then 'So chung tu
          .Cells(r, 5).Value = rng(i, 1) & ":" & rng(i, 2)
        Else
          .Cells(r, 5).Value = .Cells(r, 5).Value & Chr(10) & rng(i, 1) & ":" & rng(i, 2)
        End If
        If maHang <> rng(i, 5).Value And iDay <> Int(rng(i, 3)) Then
            iR = r 'Dong ma hang
            iDay = Int(rng(i, 3)) 'Ngay
        End If
        If .Cells(iR, 6).Value = Empty Then
          .Cells(iR, 6).Value = rng(i, 5).Value
          .Cells(iR, 7).Value = rng(i, 2).Value
          maHang = rng(i, 5).Value
        Else
          If maHang <> rng(i, 5).Value Then  'Ma hang + so luong
            maHang = rng(i, 5).Value
            .Cells(iR, 6).Value = .Cells(iR, 6).Value & Chr(10) & maHang
            .Cells(iR, 7).Value = .Cells(iR, 7).Value & Chr(10) & rng(i, 2).Value
          Else
            S = Split(.Cells(iR, 7).Value, Chr(10))
            S(UBound(S)) = S(UBound(S)) + rng(i, 2).Value
            .Cells(iR, 7).Value = Join(S, Chr(10))
          End If
        End If
      End If
    Next i
  End With
End Sub
Cảm ơn Bác Hiếu đã giúp đỡ con ạ, code ngắn hơn con tưởng nhiều Bác ạ.
 
Upvote 0
Cách trình bày kết quả có không thể hiện mối liên hệ giữa mã hàng và ca sản xuất, ví dụ mã hàng MH0011 sản xuất ca 3 nhưng ghi nhận ca 1
Mã:
Sub ABC()
  Dim rng As Range, S, fDay As Date, iDay As Date, iMonth&, maHang$
  Dim sRow&, fRow&, i&, r&, iR&

  With Sheets("Du_Lieu")
    Set rng = .Range("A2", .Range("E" & Rows.Count).End(xlUp))
    sRow = rng.Rows.Count
  End With
  With Sheets("Ket_Qua")
    fDay = .Range("F3").Value:   iMonth = Month(fDay)
    fRow = 6 'Dong tieu de
    r = fRow + Hour(rng(1, 3)) \ 6 + Int(rng(1, 3) - fDay) * 3
    .Range("E" & r & ":G102").ClearContents 'Xoa du lieu
    For i = 1 To sRow
      If Month(rng(i, 3)) = iMonth Then 'xet thang
        r = fRow + Hour(rng(i, 3)) \ 6 + Int(rng(i, 3) - fDay) * 3 'thu tu dong ket qua
        If .Cells(r, 5).Value = Empty Then 'So chung tu
          .Cells(r, 5).Value = rng(i, 1) & ":" & rng(i, 2)
        Else
          .Cells(r, 5).Value = .Cells(r, 5).Value & Chr(10) & rng(i, 1) & ":" & rng(i, 2)
        End If
        If maHang <> rng(i, 5).Value And iDay <> Int(rng(i, 3)) Then
            iR = r 'Dong ma hang
            iDay = Int(rng(i, 3)) 'Ngay
        End If
        If .Cells(iR, 6).Value = Empty Then
          .Cells(iR, 6).Value = rng(i, 5).Value
          .Cells(iR, 7).Value = rng(i, 2).Value
          maHang = rng(i, 5).Value
        Else
          If maHang <> rng(i, 5).Value Then  'Ma hang + so luong
            maHang = rng(i, 5).Value
            .Cells(iR, 6).Value = .Cells(iR, 6).Value & Chr(10) & maHang
            .Cells(iR, 7).Value = .Cells(iR, 7).Value & Chr(10) & rng(i, 2).Value
          Else
            S = Split(.Cells(iR, 7).Value, Chr(10))
            S(UBound(S)) = S(UBound(S)) + rng(i, 2).Value
            .Cells(iR, 7).Value = Join(S, Chr(10))
          End If
        End If
      End If
    Next i
  End With
End Sub
Con chào Bác Hiếu,
Cảm ơn Bác đã giúp con ạ, Bác ơi sau khi chạy code con thấy 2 điểm bên dưới con đã ghi chú, Bác xem & giúp con với ạ.
1624961299741.png
 
Upvote 0
Con chào Bác Hiếu,
Cảm ơn Bác đã giúp con ạ, Bác ơi sau khi chạy code con thấy 2 điểm bên dưới con đã ghi chú, Bác xem & giúp con với ạ.
View attachment 261527
Chỉnh lại
Mã:
Sub XYZ()
  Dim rng As Range, S, fDay As Date, iDay As Date, iMonth&, maHang$, soCT$
  Dim sRow&, fRow&, i&, r&, j&, ctR&, maR&

  With Sheets("Du_Lieu")
    Set rng = .Range("A2", .Range("E" & Rows.Count).End(xlUp))
    sRow = rng.Rows.Count
  End With
  With Sheets("Ket_Qua")
    fDay = .Range("F3").Value:   iMonth = Month(fDay)
    fRow = 6 'Dong tieu de
    r = fRow + Hour(rng(1, 3)) \ 6 + Int(rng(1, 3) - fDay) * 3
    .Range("E" & r & ":G102").ClearContents 'Xoa du lieu
    For i = 1 To sRow
      If Month(rng(i, 3)) = iMonth Then 'xet thang
        r = fRow + Hour(rng(i, 3)) \ 6 + Int(rng(i, 3) - fDay) * 3 'thu tu dong ket qua
        If soCT <> rng(i, 1).Value Then 'So chung tu moi
          soCT = rng(i, 1).Value
          ctR = r 'dong so CT
          If .Cells(r, 5).Value = Empty Then
            .Cells(r, 5).Value = rng(i, 1) & ":" & rng(i, 2)
          Else
            .Cells(r, 5).Value = .Cells(r, 5).Value & Chr(10) & rng(i, 1) & ":" & rng(i, 2)
          End If
        Else
          j = InStrRev(.Cells(ctR, 5), ":")
          .Cells(ctR, 5) = Mid(.Cells(ctR, 5), 1, j) & Val(Mid(.Cells(ctR, 5), j + 1, 16)) + rng(i, 2)
        End If
        
        If maHang <> rng(i, 5).Value Then 'Ma hang moi
          maHang = rng(i, 5).Value
          maR = r 'Dong ma hang
          If .Cells(r, 6).Value = Empty Then
            .Cells(r, 6).Value = rng(i, 5).Value
            .Cells(r, 7).Value = rng(i, 2).Value
          Else
            .Cells(r, 6).Value = .Cells(r, 6).Value & Chr(10) & maHang
            .Cells(r, 7).Value = .Cells(r, 7).Value & Chr(10) & rng(i, 2).Value
          End If
        Else
          S = Split(.Cells(maR, 7).Value, Chr(10))
          S(UBound(S)) = S(UBound(S)) + rng(i, 2).Value
          .Cells(maR, 7).Value = Join(S, Chr(10))
        End If
      End If
    Next i
  End With
End Sub
 
Upvote 0
Chỉnh lại
Mã:
Sub XYZ()
  Dim rng As Range, S, fDay As Date, iDay As Date, iMonth&, maHang$, soCT$
  Dim sRow&, fRow&, i&, r&, j&, ctR&, maR&

  With Sheets("Du_Lieu")
    Set rng = .Range("A2", .Range("E" & Rows.Count).End(xlUp))
    sRow = rng.Rows.Count
  End With
  With Sheets("Ket_Qua")
    fDay = .Range("F3").Value:   iMonth = Month(fDay)
    fRow = 6 'Dong tieu de
    r = fRow + Hour(rng(1, 3)) \ 6 + Int(rng(1, 3) - fDay) * 3
    .Range("E" & r & ":G102").ClearContents 'Xoa du lieu
    For i = 1 To sRow
      If Month(rng(i, 3)) = iMonth Then 'xet thang
        r = fRow + Hour(rng(i, 3)) \ 6 + Int(rng(i, 3) - fDay) * 3 'thu tu dong ket qua
        If soCT <> rng(i, 1).Value Then 'So chung tu moi
          soCT = rng(i, 1).Value
          ctR = r 'dong so CT
          If .Cells(r, 5).Value = Empty Then
            .Cells(r, 5).Value = rng(i, 1) & ":" & rng(i, 2)
          Else
            .Cells(r, 5).Value = .Cells(r, 5).Value & Chr(10) & rng(i, 1) & ":" & rng(i, 2)
          End If
        Else
          j = InStrRev(.Cells(ctR, 5), ":")
          .Cells(ctR, 5) = Mid(.Cells(ctR, 5), 1, j) & Val(Mid(.Cells(ctR, 5), j + 1, 16)) + rng(i, 2)
        End If
       
        If maHang <> rng(i, 5).Value Then 'Ma hang moi
          maHang = rng(i, 5).Value
          maR = r 'Dong ma hang
          If .Cells(r, 6).Value = Empty Then
            .Cells(r, 6).Value = rng(i, 5).Value
            .Cells(r, 7).Value = rng(i, 2).Value
          Else
            .Cells(r, 6).Value = .Cells(r, 6).Value & Chr(10) & maHang
            .Cells(r, 7).Value = .Cells(r, 7).Value & Chr(10) & rng(i, 2).Value
          End If
        Else
          S = Split(.Cells(maR, 7).Value, Chr(10))
          S(UBound(S)) = S(UBound(S)) + rng(i, 2).Value
          .Cells(maR, 7).Value = Join(S, Chr(10))
        End If
      End If
    Next i
  End With
End Sub
Con cảm ơn Bác Hiếu nhiều ạ, con đã thấy kết quả đúng như ý của mình rồi Bác ạ.
 
Upvote 0
Web KT
Back
Top Bottom