Copy dữ liệu dựa vào số lượng (1 người xem)

Liên hệ QC

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

ppicatru

Thành viên thường trực
Tham gia
3/6/17
Bài viết
293
Được thích
40
Giới tính
Nữ
Nhờ diễn đàn giúp em công thức copy dữ liệu dựa vào cột số lượng
 

File đính kèm

Nhờ diễn đàn giúp em công thức copy dữ liệu dựa vào cột số lượng
Thử:
Mã:
A11=IFERROR(IF(COUNTIF($A$10:A10,A10)=VLOOKUP(A10,$A$2:$B$8,2,),INDEX($A$2:$A$8,MATCH(A10,$A$2:$A$8,)+1),A10),T($A2))
B11=VLOOKUP(A11,$A$2:$B$8,2,)
Enter, fill xuống.

Thân
 

File đính kèm

Nhờ diễn đàn giúp em công thức copy dữ liệu dựa vào cột số lượng
Đây bạn xem.
Mã:
Sub copy()
Dim arr, arr1
Dim a As Long, i As Long, b As Long, j As Long
With Sheet1
   arr = .Range("A2:b" & .Range("A" & Rows.Count).End(xlUp).Row).Value
   ReDim arr1(1 To .Rows.Count, 1 To 2)
   For i = 1 To UBound(arr, 1)
      a = arr(i, 2)
         For j = 1 To a
              b = b + 1
             arr1(b, 1) = arr(i, 1)
             arr1(b, 2) = arr(i, 2)
         Next j
      a = 0
  Next i
   .Range("d2").Resize(.Rows.Count - 2, 2).ClearContents
  .Range("D2").Resize(b, 2).Value = arr1
End With
End Sub
 

File đính kèm

Đây bạn xem.
Mã:
Sub copy()
Dim arr, arr1
Dim a As Long, i As Long, b As Long, j As Long
With Sheet1
   arr = .Range("A2:b" & .Range("A" & Rows.Count).End(xlUp).Row).Value
   ReDim arr1(1 To .Rows.Count, 1 To 2)
   For i = 1 To UBound(arr, 1)
      a = arr(i, 2)
         For j = 1 To a
              b = b + 1
             arr1(b, 1) = arr(i, 1)
             arr1(b, 2) = arr(i, 2)
         Next j
      a = 0
  Next i
   .Range("d2").Resize(.Rows.Count - 2, 2).ClearContents
  .Range("D2").Resize(b, 2).Value = arr1
End With
End Sub
Cảm ơn bạn.
 
Thử:
Mã:
A11=IFERROR(IF(COUNTIF($A$10:A10,A10)=VLOOKUP(A10,$A$2:$B$8,2,),INDEX($A$2:$A$8,MATCH(A10,$A$2:$A$8,)+1),A10),T($A2))
B11=VLOOKUP(A11,$A$2:$B$8,2,)
Enter, fill xuống.

Thân
Kết quả cùng trên 1 sheet thì mình chỉnh sửa công thức được, còn nếu kết quả ở sheet khác thì mình sửa công thức nó bị lỗi nhờ bạn xem giùm
Bài đã được tự động gộp:

Đây bạn xem.
Mã:
Sub copy()
Dim arr, arr1
Dim a As Long, i As Long, b As Long, j As Long
With Sheet1
   arr = .Range("A2:b" & .Range("A" & Rows.Count).End(xlUp).Row).Value
   ReDim arr1(1 To .Rows.Count, 1 To 2)
   For i = 1 To UBound(arr, 1)
      a = arr(i, 2)
         For j = 1 To a
              b = b + 1
             arr1(b, 1) = arr(i, 1)
             arr1(b, 2) = arr(i, 2)
         Next j
      a = 0
  Next i
   .Range("d2").Resize(.Rows.Count - 2, 2).ClearContents
  .Range("D2").Resize(b, 2).Value = arr1
End With
End Sub
Còn muốn kết quả ở một sheet khác sửa code như thế nào vậy bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
Kết quả cùng trên 1 sheet thì mình chỉnh sửa công thức được, còn nếu kết quả ở sheet khác thì mình sửa công thức nó bị lỗi nhờ bạn xem giùm
Bài đã được tự động gộp:


Còn muốn kết quả ở một sheet khác sửa code như thế nào vậy bạn.
PHP:
=IFERROR(IF(COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$12,3,),T(INDEX(Trang_tính1!$A$2:$A$12,MATCH(A1,Trang_tính1!$A$2:$A$12,)+1)),A1),T(Trang_tính1!$A2))
 
Có công thức nào dễ hiểu hơn không bạn, mình nhìn công thức này không hiểu
Chắc đành phải giải thích để bạn hiểu vậy:
  • Giải thuật: là đếm mã ở ô liền trên, nếu nó đã hiện đủ số lượng thì truy tìm và hiện mã kế tiếp, nếu chưa đủ số lượng thì lấy mã đó chép xuống.
    • Ví dụ: Giả sử công thức đang ở ô A3, và A2 đã có hiện mã "máy in" rồi, vậy nó đếm (từ A1: A2) thì mã "máy in" mới xuất hiện có 1 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A2 xuống =>A3="máy in".
    • Xuống ô A4, nó đếm (từ A1: A3) thì mã "máy in" mới xuất hiện có 2 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A3 xuống =>A4="máy in".
    • Xuống ô A5, nó đếm (từ A1: A4) thì mã "máy in" đã xuất hiện 3 lần, đã đủ số lượng là 3, vậy nó lấy mã "máy in", truy tìm bên Sheet Trang_Tính1!A2: A500 có dòng là bao nhiêu, nó cộng thêm +1 dòng sẽ ra mã kế tiếp là "máy tính" =>A5="máy tính".
    • Tương tự cho các dòng dưới.....
Kết quả cùng trên 1 sheet thì mình chỉnh sửa công thức được, còn nếu kết quả ở sheet khác thì mình sửa công thức nó bị lỗi nhờ bạn xem giùm
Công thức điều chỉnh cho phù hợp với 2 sheet phân biệt, bạn @huonglien1901 đã làm cho bạn rồi, nay tôi ghi chi tiết theo giải thuật trên:

=IFERROR( IF( COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,) , T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)) , A1 ) , T(Trang_tính1!$A2))
  • COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,): dùng để đếm mã ở ô trên đã bằng với số lượng quy định hay chưa
  • Nếu bằng, tức điều kiện "Đúng", thì thực hiện lệnh T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)): tức truy tìm mã phát sinh kế tiếp.
  • Nếu chưa bằng số lượng quy định, thì lấy ô ở trên, Vd: công thức đang đứng ở A2, thì lấy giá trị ô A1.
  • Riêng do vị trí đầu tiên (ô A2), giá trị tìm là ô A1="tên" thì hàm VLOOKUP("tên",Trang_tính1!$A$2:$C$500,3,) sẽ báo lỗi, khi ấy hàm IFERROR( "công thức lỗi" , T(Trang_tính1!$A2) ) sẽ trả ra giá trị T(Trang_tính1!$A2), tức A2= "máy in".
  • Và cứ tiếp tục như cách giải thích trên..
Thân
 

File đính kèm

Chắc đành phải giải thích để bạn hiểu vậy:
  • Giải thuật: là đếm mã ở ô liền trên, nếu nó đã hiện đủ số lượng thì truy tìm và hiện mã kế tiếp, nếu chưa đủ số lượng thì lấy mã đó chép xuống.
    • Ví dụ: Giả sử công thức đang ở ô A3, và A2 đã có hiện mã "máy in" rồi, vậy nó đếm (từ A1: A2) thì mã "máy in" mới xuất hiện có 1 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A2 xuống =>A3="máy in".
    • Xuống ô A4, nó đếm (từ A1: A3) thì mã "máy in" mới xuất hiện có 2 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A3 xuống =>A4="máy in".
    • Xuống ô A5, nó đếm (từ A1: A4) thì mã "máy in" đã xuất hiện 3 lần, đã đủ số lượng là 3, vậy nó lấy mã "máy in", truy tìm bên Sheet Trang_Tính1!A2: A500 có dòng là bao nhiêu, nó cộng thêm +1 dòng sẽ ra mã kế tiếp là "máy tính" =>A5="máy tính".
    • Tương tự cho các dòng dưới.....

Công thức điều chỉnh cho phù hợp với 2 sheet phân biệt, bạn @huonglien1901 đã làm cho bạn rồi, nay tôi ghi chi tiết theo giải thuật trên:

=IFERROR( IF( COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,) , T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)) , A1 ) , T(Trang_tính1!$A2))
  • COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,): dùng để đếm mã ở ô trên đã bằng với số lượng quy định hay chưa
  • Nếu bằng, tức điều kiện "Đúng", thì thực hiện lệnh T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)): tức truy tìm mã phát sinh kế tiếp.
  • Nếu chưa bằng số lượng quy định, thì lấy ô ở trên, Vd: công thức đang đứng ở A2, thì lấy giá trị ô A1.
  • Riêng do vị trí đầu tiên (ô A2), giá trị tìm là ô A1="tên" thì hàm VLOOKUP("tên",Trang_tính1!$A$2:$C$500,3,) sẽ báo lỗi, khi ấy hàm IFERROR( "công thức lỗi" , T(Trang_tính1!$A2) ) sẽ trả ra giá trị T(Trang_tính1!$A2), tức A2= "máy in".
  • Và cứ tiếp tục như cách giải thích trên..
Thân
Cảm ơn bạn nhiều, mình chỉ được học những công thức cơ bản, nên gặp những công thức này mình không hiểu, để mình tìm hiểu từ từ.
 
Chắc đành phải giải thích để bạn hiểu vậy:
  • Giải thuật: là đếm mã ở ô liền trên, nếu nó đã hiện đủ số lượng thì truy tìm và hiện mã kế tiếp, nếu chưa đủ số lượng thì lấy mã đó chép xuống.
    • Ví dụ: Giả sử công thức đang ở ô A3, và A2 đã có hiện mã "máy in" rồi, vậy nó đếm (từ A1: A2) thì mã "máy in" mới xuất hiện có 1 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A2 xuống =>A3="máy in".
    • Xuống ô A4, nó đếm (từ A1: A3) thì mã "máy in" mới xuất hiện có 2 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A3 xuống =>A4="máy in".
    • Xuống ô A5, nó đếm (từ A1: A4) thì mã "máy in" đã xuất hiện 3 lần, đã đủ số lượng là 3, vậy nó lấy mã "máy in", truy tìm bên Sheet Trang_Tính1!A2: A500 có dòng là bao nhiêu, nó cộng thêm +1 dòng sẽ ra mã kế tiếp là "máy tính" =>A5="máy tính".
    • Tương tự cho các dòng dưới.....

Công thức điều chỉnh cho phù hợp với 2 sheet phân biệt, bạn @huonglien1901 đã làm cho bạn rồi, nay tôi ghi chi tiết theo giải thuật trên:

=IFERROR( IF( COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,) , T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)) , A1 ) , T(Trang_tính1!$A2))
  • COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,): dùng để đếm mã ở ô trên đã bằng với số lượng quy định hay chưa
  • Nếu bằng, tức điều kiện "Đúng", thì thực hiện lệnh T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)): tức truy tìm mã phát sinh kế tiếp.
  • Nếu chưa bằng số lượng quy định, thì lấy ô ở trên, Vd: công thức đang đứng ở A2, thì lấy giá trị ô A1.
  • Riêng do vị trí đầu tiên (ô A2), giá trị tìm là ô A1="tên" thì hàm VLOOKUP("tên",Trang_tính1!$A$2:$C$500,3,) sẽ báo lỗi, khi ấy hàm IFERROR( "công thức lỗi" , T(Trang_tính1!$A2) ) sẽ trả ra giá trị T(Trang_tính1!$A2), tức A2= "máy in".
  • Và cứ tiếp tục như cách giải thích trên..
Thân
Hay quá Anh Cả ơi!!!!
Chúc Anh ngày vui.
 
Chắc đành phải giải thích để bạn hiểu vậy:
  • Giải thuật: là đếm mã ở ô liền trên, nếu nó đã hiện đủ số lượng thì truy tìm và hiện mã kế tiếp, nếu chưa đủ số lượng thì lấy mã đó chép xuống.
    • Ví dụ: Giả sử công thức đang ở ô A3, và A2 đã có hiện mã "máy in" rồi, vậy nó đếm (từ A1: A2) thì mã "máy in" mới xuất hiện có 1 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A2 xuống =>A3="máy in".
    • Xuống ô A4, nó đếm (từ A1: A3) thì mã "máy in" mới xuất hiện có 2 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A3 xuống =>A4="máy in".
    • Xuống ô A5, nó đếm (từ A1: A4) thì mã "máy in" đã xuất hiện 3 lần, đã đủ số lượng là 3, vậy nó lấy mã "máy in", truy tìm bên Sheet Trang_Tính1!A2: A500 có dòng là bao nhiêu, nó cộng thêm +1 dòng sẽ ra mã kế tiếp là "máy tính" =>A5="máy tính".
    • Tương tự cho các dòng dưới.....

Công thức điều chỉnh cho phù hợp với 2 sheet phân biệt, bạn @huonglien1901 đã làm cho bạn rồi, nay tôi ghi chi tiết theo giải thuật trên:

=IFERROR( IF( COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,) , T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)) , A1 ) , T(Trang_tính1!$A2))
  • COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,): dùng để đếm mã ở ô trên đã bằng với số lượng quy định hay chưa
  • Nếu bằng, tức điều kiện "Đúng", thì thực hiện lệnh T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)): tức truy tìm mã phát sinh kế tiếp.
  • Nếu chưa bằng số lượng quy định, thì lấy ô ở trên, Vd: công thức đang đứng ở A2, thì lấy giá trị ô A1.
  • Riêng do vị trí đầu tiên (ô A2), giá trị tìm là ô A1="tên" thì hàm VLOOKUP("tên",Trang_tính1!$A$2:$C$500,3,) sẽ báo lỗi, khi ấy hàm IFERROR( "công thức lỗi" , T(Trang_tính1!$A2) ) sẽ trả ra giá trị T(Trang_tính1!$A2), tức A2= "máy in".
  • Và cứ tiếp tục như cách giải thích trên..
Thân
Công thức hay quá, cám ơn @Phan Thế Hiệp. Chúc bạn tháng mới vui vẻ!
 
Chắc đành phải giải thích để bạn hiểu vậy:
  • Giải thuật: là đếm mã ở ô liền trên, nếu nó đã hiện đủ số lượng thì truy tìm và hiện mã kế tiếp, nếu chưa đủ số lượng thì lấy mã đó chép xuống.
    • Ví dụ: Giả sử công thức đang ở ô A3, và A2 đã có hiện mã "máy in" rồi, vậy nó đếm (từ A1: A2) thì mã "máy in" mới xuất hiện có 1 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A2 xuống =>A3="máy in".
    • Xuống ô A4, nó đếm (từ A1: A3) thì mã "máy in" mới xuất hiện có 2 lần, vẫn chưa đủ số lượng là 3, vậy nó chép mã "máy in" ở ô A3 xuống =>A4="máy in".
    • Xuống ô A5, nó đếm (từ A1: A4) thì mã "máy in" đã xuất hiện 3 lần, đã đủ số lượng là 3, vậy nó lấy mã "máy in", truy tìm bên Sheet Trang_Tính1!A2: A500 có dòng là bao nhiêu, nó cộng thêm +1 dòng sẽ ra mã kế tiếp là "máy tính" =>A5="máy tính".
    • Tương tự cho các dòng dưới.....
Công thức điều chỉnh cho phù hợp với 2 sheet phân biệt, bạn @huonglien1901 đã làm cho bạn rồi, nay tôi ghi chi tiết theo giải thuật trên:

=IFERROR( IF( COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,) , T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)) , A1 ) , T(Trang_tính1!$A2))
  • COUNTIF($A$1:A1,A1)=VLOOKUP(A1,Trang_tính1!$A$2:$C$500,3,): dùng để đếm mã ở ô trên đã bằng với số lượng quy định hay chưa
  • Nếu bằng, tức điều kiện "Đúng", thì thực hiện lệnh T(INDEX(Trang_tính1!$A$2:$A$500,MATCH(A1,Trang_tính1!$A$2:$A$500,)+1)): tức truy tìm mã phát sinh kế tiếp.
  • Nếu chưa bằng số lượng quy định, thì lấy ô ở trên, Vd: công thức đang đứng ở A2, thì lấy giá trị ô A1.
  • Riêng do vị trí đầu tiên (ô A2), giá trị tìm là ô A1="tên" thì hàm VLOOKUP("tên",Trang_tính1!$A$2:$C$500,3,) sẽ báo lỗi, khi ấy hàm IFERROR( "công thức lỗi" , T(Trang_tính1!$A2) ) sẽ trả ra giá trị T(Trang_tính1!$A2), tức A2= "máy in".
  • Và cứ tiếp tục như cách giải thích trên..
Thân
Bạn chỉnh sửa công thức giúp mình, nếu trường hợp nếu tên trùng nhau thì công thức không áp dụng được.
 

File đính kèm

Bạn chỉnh sửa công thức giúp mình, nếu trường hợp nếu tên trùng nhau thì công thức không áp dụng được.
Việc này thì bạn phải biết tùy nghi ứng biến chứ!?

Công thức với yêu cầu ban đầu đã xem "Tên" là Vùng dữ liệu không được trùng lắp.

Nay, với yêu cầu mới "Tên hàng" có thể bị trùng lắp, thì bạn tự mình sẽ phải biết làm sao để "không bị trùng".
Chuyện đơn giản nhất và luôn hợp với yêu cầu quản lý cơ sở dữ liệu chính là việc đặt "". Nhờ mã mà tên hàng có thể trùng, nhưng "Mã" thì không bao giờ được trùng.

Ví dụ thực tế: số CMND của bạn chính là "Mã" dành để chỉ ra "mọi" thông tin về cá nhân của bạn, có thể có người trùng tên với bạn, nhưng số CMND thì không bao giờ.

Thân
 

File đính kèm

Việc này thì bạn phải biết tùy nghi ứng biến chứ!?

Công thức với yêu cầu ban đầu đã xem "Tên" là Vùng dữ liệu không được trùng lắp.

Nay, với yêu cầu mới "Tên hàng" có thể bị trùng lắp, thì bạn tự mình sẽ phải biết làm sao để "không bị trùng".
Chuyện đơn giản nhất và luôn hợp với yêu cầu quản lý cơ sở dữ liệu chính là việc đặt "". Nhờ mã mà tên hàng có thể trùng, nhưng "Mã" thì không bao giờ được trùng.

Ví dụ thực tế: số CMND của bạn chính là "Mã" dành để chỉ ra "mọi" thông tin về cá nhân của bạn, có thể có người trùng tên với bạn, nhưng số CMND thì không bao giờ.

Thân
Cảm ơn hướng dẫn của.Mình sẽ rút kinh nghiệm về việc này.
 
Web KT

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

Back
Top Bottom