Thử:Nhờ diễn đàn giúp em công thức copy dữ liệu dựa vào cột số lượng
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,)
Đây bạn xem.Nhờ diễn đàn giúp em công thức copy dữ liệu dựa vào cột số lượng
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.Đâ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ó 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ểuThử:
Enter, fill xuống.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,)
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ùmThử:
Enter, fill xuống.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,)
Thân
Còn muốn kết quả ở một sheet khác sửa code như thế nào vậy bạn.Đâ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
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.
=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))
Chắc đành phải giải thích để bạn hiểu vậy: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
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: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ả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))
Thân
- 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..
Hay quá Anh Cả ơi!!!!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))
Thân
- 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..
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))
Thân
- 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..
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.Chắc đành phải giải thích để bạn hiểu vậy:
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:
- 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.....
=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))
Thân
- 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..
Các bạn giúp mình chỉnh sửa công thức này với.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ứ!?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.
Cảm ơn hướng dẫn của.Mình sẽ rút kinh nghiệm về việc này.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 "Mã". 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