Theo mình nghĩ font chẳng có vấn đề gì đâu! Mình dùng font VNI-Times mà! Có lẽ do mình chọn size = 8 nhỏ quá nên nó hiện chữ nhìn giống bị không đúng font thôi. Các bạn chọn size lớn hơn tí (size = 12) xem sao!Làm sao đọc được file này các bạn ơi?
(Mình xài unicode)
Bạn dùng thử code sau:Theo mình nghĩ font chẳng có vấn đề gì đâu! Mình dùng font VNI-Times mà! Có lẽ do mình chọn size = 8 nhỏ quá nên nó hiện chữ nhìn giống bị không đúng font thôi. Các bạn chọn size lớn hơn tí (size = 12) xem sao!
Cám ơn.
Sub CopyData()
Dim endR As Long
Sheets("BCNX").Select
Range("B9:Y10000").ClearContents
endR = Cells(65000, 1).End(xlUp).Row
If endR <= 8 Then Exit Sub
Range("B9:Y" & endR).Value = Range("B8:Y8").Value
End Sub
Cám ơn bạn rất nhiều. Nhưng code của bạn tôi xin được phép điều chỉnh như sau mới đúng ý chứ không nó copy toàn value cả dù các cell ở row8 có chưa công thức.Bạn dùng thử code sau:
PHP:Sub CopyData() Dim endR As Long Sheets("BCNX").Select Range("B9:Y10000").ClearContents endR = Cells(65000, 1).End(xlUp).Row If endR <= 8 Then Exit Sub Range("B9:Y" & endR).Value = Range("B8:Y8").Value End Sub
Cám ơn bạn rất nhiều. Nhưng code của bạn tôi xin được phép điều chỉnh như sau mới đúng ý chứ không nó copy toàn value cả dù các cell ở row8 có chưa công thức.Bạn dùng thử code sau:
PHP:Sub CopyData() Dim endR As Long Sheets("BCNX").Select Range("B9:Y10000").ClearContents endR = Cells(65000, 1).End(xlUp).Row If endR <= 8 Then Exit Sub Range("B9:Y" & endR).Value = Range("B8:Y8").Value End Sub
Bạn nên gom bớt bài lại. Dùng code sau nhé.Cám ơn bạn rất nhiều. Nhưng code của bạn tôi xin được phép điều chỉnh như sau mới đúng ý chứ không nó copy toàn value cả dù các cell ở row8 có chưa công thức.
...
If endR <= 8 Then MsgBox "Hay nhap gia tri bat dau vao cell A8": Exit Sub
Range("B8:Y8").Copy Range("B9:Y" & endR)
...
Như vậy là OK rồi! Nếu được bạn hoặc các thành viên GPE có thể bổ sung thêm cho tôi một ý nữa cho nó hoàn hảo nhé!
Cũng là ý đó thôi nhưng tôi chỉ cần nhập một giá trị (number) nào đó vào cell A8 rồi Click nút "Cập nhật" thì Macro sẽ lấy giá trị đó (cell A8) dò tìm sang cột A (cột TT) của sheet("NKNX") nếu gặp ở chổ nào thì copy từ đó trở xuống paste sang cột A của sheet ("BCNX") bắt đầu ở cell A8 rồi tiếp đến là các lệnh như bạn đã làm.
Ví dụ: Tôi nhập vào cell A8 là 3 rồi Click... thì KQ là A8=3; A9=4; A10=5 và A11=6 hoặc
cell A8 là 5 rồi Click... thì KQ là A8=5; A9=6
Rất mong sớm nhận được sự trợ giúp của bạn cùng tất cả các thành viên trên GPE!
Sub CopyData()
Dim endR As Long, SoDau As Long, SoCuoi As Long
Sheets("BCNX").Select
Range("A9:A10000").ClearContents
SoDau = Range("A8")
With Sheets("NKNX")
endR = .Cells(65000, 2).End(xlUp).Row
SoCuoi = .Cells(endR, 2).Value
End With
If SoCuoi < SoDau Then Exit Sub
Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi
With Range("A9:A" & 8 + SoCuoi - SoDau - 1)
.FormulaR1C1 = "=+R[-1]C+1"
.Value = .Value
End With
Range("B9:Y10000").ClearContents
endR = 8 + SoCuoi - SoDau
Range("B9:Y" & endR).Value = Range("B8:Y8").Value
End Sub
Bạn nên gom bớt bài lại. Dùng code sau nhé.
PHP:Sub CopyData() Dim endR As Long, SoDau As Long, SoCuoi As Long Sheets("BCNX").Select Range("A9:A10000").ClearContents SoDau = Range("A8") With Sheets("NKNX") endR = .Cells(65000, 2).End(xlUp).Row SoCuoi = .Cells(endR, 2).Value End With If SoCuoi < SoDau Then Exit Sub Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi With Range("A9:A" & 8 + SoCuoi - SoDau - 1) .FormulaR1C1 = "=+R[-1]C+1" .Value = .Value End With Range("B9:Y10000").ClearContents endR = 8 + SoCuoi - SoDau Range("B9:Y" & endR).Value = Range("B8:Y8").Value End Sub
Sorry, do lúc đầu chưa lường hết và chưa test cẩn thận.Cám ơn bạn rất nhiều. Đúng như yêu cầu rồi nhưng code thi hành vẫn còn một số vướng mắc sau:
1./ Cột tham chiếu ở NKNX là A
…
endR = .Cells(65000, 2).End(xlUp).Row
SoCuoi = .Cells(endR, 2).Value
…
Tôi đã sửa thành 1 và đã OK rồi. Bạn kiểm tra những điều tiếp nhé!
2./ Giá trị BCNX!A8 < MAX(NKNX!A(n)) 1 đơn vị (Nghĩa là BCNX!A8 nhỏ hơn số cuối 1 đ.vị) thì KQuả BCNX cells A8=1; A9=2 Như vậy thì không đúng!
3./ Giá trị BCNX!A8 = MAX(NKNX!A(n)) thì KQuả BCNX cells A8=2; A9=3 và có thêm A7=1 nữa!
4./ Cột A của NKNX là các số tự nhiên liên tiếp >=1. Nếu được bạn có thể thêm MsgBox để ngăn những giá trị < 1hoặc là text
Bạn vui lòng kiểm tra và Sớm cập nhật giúp tôi.
Một lần nữa, xin cám ơn.
PS: Vừa rồi do mạng nghẽn gởi bài mấy cũng không được nên mình đã Click nhiều lần và kết quả là thế. Có cách nào xóa bớt đi không bạn?
4./ Cột A của NKNX là các số tự nhiên liên tiếp >=1.
Sub CopyData()
Dim endR As Long, SoDau As Long, SoCuoi As Long
Sheets("BCNX").Select
Range("A9:A10000").ClearContents
SoDau = Range("A8")
With Sheets("NKNX")
endR = .Cells(65000, 2).End(xlUp).Row
SoCuoi = .Cells(endR, 2).Value
End With
If SoCuoi < SoDau Then Exit Sub
endR = 8 + SoCuoi - SoDau
If endR = 8 Then
Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi
Range("B9:Y10000").ClearContents
Exit Sub
Else
Range("B9:Y10000").ClearContents
Range("B9:Y" & endR - 1).Value = Range("B8:Y8").Value
End If
If SoCuoi - SoDau = 1 Then
Range("A9") = SoCuoi
Else
With Range("A9:A" & 8 + SoCuoi - SoDau - 1)
.FormulaR1C1 = "=+R[-1]C+1"
.Value = .Value
End With
End If
End Sub
Sorry, do lúc đầu chưa lường hết và chưa test cẩn thận.
Bạn sử dụng code sau, nếu OK thì sẽ rút gọn lại theo dạng select case endr
Số này đương nhiên là số và > 1 rồi.PHP:4./ Cột A của NKNX là các số tự nhiên liên tiếp >=1.
=IF(C7="","",ROW()-6)
PHP:Sub CopyData() Dim endR As Long, SoDau As Long, SoCuoi As Long Sheets("BCNX").Select Range("A9:A10000").ClearContents SoDau = Range("A8") With Sheets("NKNX") endR = .Cells(65000, 2).End(xlUp).Row SoCuoi = .Cells(endR, 2).Value End With If SoCuoi < SoDau Then Exit Sub endR = 8 + SoCuoi - SoDau If endR = 8 Then Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi Range("B9:Y10000").ClearContents Exit Sub Else Range("B9:Y10000").ClearContents Range("B9:Y" & endR - 1).Value = Range("B8:Y8").Value End If If SoCuoi - SoDau = 1 Then Range("A9") = SoCuoi Else With Range("A9:A" & 8 + SoCuoi - SoDau - 1) .FormulaR1C1 = "=+R[-1]C+1" .Value = .Value End With End If End Sub
Bạn không nói kiểm tra cái gì cả, và cái hàm vlôkup trên khi lấy giá trị xong chuyển thành value cho nhẹ file.Tôi gởi file mới lên bạn xem và kiểm tra giùm nhé!
Bạn thử nhập vào các số như mình nói thì kết quả ở 2 sheet sẽ khác nhau!Bạn không nói kiểm tra cái gì cả, và cái hàm vlôkup trên khi lấy giá trị xong chuyển thành value cho nhẹ file.
Bạn dùng code sau thử. Sorry vì chưa test hết!Bạn thử nhập vào các số như mình nói thì kết quả ở 2 sheet sẽ khác nhau!
Theo như file mới gởi:
- Sheet BX là code cũ, giá trị nhập vào ở cell A8<=10 thì kết quả là đúng nhưng A8=11 or =12 (2 số cuối của sheet NK cột A) thì kết quả lại sai mất. Ngược lại với sheet NX:
- Sheet NX là code mới đây nhất, gt cell A8<=10 thì kết quả lại lấy tới 11 không có 12 còn A8=11;12 thì kết quả lại đúng.
Bạn vui lòng nhập thử xem sẽ hiểu ngay kết quả và chỉnh lại giúp tôi với.
Cám ơn nhiều.
Còn để value tôi thấy nó chuyển xuống các hàng dưới đều cùng 1 giá trị giống hàng 8 hơn nữa sheet NX chỉ lấy một số cột ở sheet NK nên để value tôi nghĩ e không lấy được! Theo tôi nghĩ để cho nhẹ file thì mỗi lần làm xong thì minh chỉ nhập giá trị lớn nhất và up một lần nữa cho nó xóa sạch cũng được bởi sheet NX xem như là kết quả báo cáo hàng ngày thôi. Nếu bạn có cách nào mà khi workbook close cell A8 giá trị lớn nhất cột A sheet NK và clear nội dung từ Row9 đến hết bổ sung giúp mình luôn nhé.
Chào thân ái!
Sub UpNX()
Dim endR As Long, SoDau As Long, SoCuoi As Long
Sheets("NX").Select
Range("A9:A10000").ClearContents
SoDau = Range("A8")
With Sheets("NK")
endR = .Cells(65000, 1).End(xlUp).Row
SoCuoi = .Cells(endR, 1).Value
End With
If SoCuoi <= SoDau Then Exit Sub
endR = 8 + SoCuoi - SoDau
If SoCuoi - SoDau = 1 Then
Range("A9") = SoCuoi
Else
With Range("A9:A" & 8 + SoCuoi - SoDau)
.FormulaR1C1 = "=+R[-1]C+1"
.Value = .Value
End With
End If
If endR = 8 Then
Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi
Range("B9:Y10000").ClearContents
Exit Sub
Else
Range("B9:Y10000").ClearContents
Range("B8:Y8").Copy Range("B9:Y" & endR)
Range("B9:Y" & endR).Value = Range("B9:Y" & endR).Value
End If
End Sub
Bạn dùng code sau thử. Sorry vì chưa test hết!
PHP:Sub UpNX() Dim endR As Long, SoDau As Long, SoCuoi As Long Sheets("NX").Select Range("A9:A10000").ClearContents SoDau = Range("A8") With Sheets("NK") endR = .Cells(65000, 1).End(xlUp).Row SoCuoi = .Cells(endR, 1).Value End With If SoCuoi <= SoDau Then Exit Sub endR = 8 + SoCuoi - SoDau If SoCuoi - SoDau = 1 Then Range("A9") = SoCuoi Else With Range("A9:A" & 8 + SoCuoi - SoDau) .FormulaR1C1 = "=+R[-1]C+1" .Value = .Value End With End If If endR = 8 Then Range("A" & 8 + SoCuoi - SoDau).Value = SoCuoi Range("B9:Y10000").ClearContents Exit Sub Else Range("B9:Y10000").ClearContents Range("B8:Y8").Copy Range("B9:Y" & endR) Range("B9:Y" & endR).Value = Range("B9:Y" & endR).Value End If End Sub
Range("A9:A10000").ClearContents (Code trên của bạn, dòng 4 trên xuống) sửa lại như sau
Range("A9:U10000").ClearContents !
Chưa hiểu yêu cầu của bạn là gì cả. Cụ thể hơn đi.Cám ơn bạn rất nhiều. Rất tuyệt vời! Chỉ một đoạn code nho nhỏ và 1 cái Click nhẹ nhàng đã phải tiết kiệm khá nhiều thời gian và đảm bảo an toàn dữ liệu nữa đó bạn!
Qua sự tận tình giúp đỡ của bạn mà tôi đã “phát minh” thêm một sub() cũng khá bổ ích! Tôi gởi file lên bạn xem và bổ sung thêm những gì còn là “râu ria” nhé!
À bạn, trong code có một dòng cần chỉnh lại như sau thì nó mới ClearContents hết trong mọi trường hợp chứ còn trường hợp A8=Max… thì nó không Clear.Contents Range("B9:U10000")!
<FONT face=Arial>PHP:Range("A9:A10000").ClearContents (Code trên của bạn, dòng 4 trên xuống) sửa lại như sau Range("A9:U10000").ClearContents !
Sub Footer()
Dim i As Long
i = Range("a1").Value + 1
Cells(i, 7).Value = "TOÅNG COÄNG:"
Cells(i, 8).Value = "=counta(R8C8:R[-1]C) & R6C12"
' Cells(i, 11).Value = "=Sum(R8C11:R[-1]C)"
' Cells(i, 12).Value = "=Sum(R8C12:R[-1]C)"
' Cells(i, 13).Value = "=Sum(R8C13:R[-1]C)"
' Cells(i, 14).Value = "=Sum(R8C14:R[-1]C)"
Cells(i, 16).Value = "=Sum(R8C16:R[-1]C)"
Cells(i, 17).Value = "=Sum(R8C17:R[-1]C)"
Cells(i, 18).Value = "=Sum(R8C18:R[-1]C)"
Cells(i, 20).Value = "=Sum(R8C20:R[-1]C)"
Cells(i + 2, 19).Value = "Quy Nhôn, ngaøy " & Format(Now(), "d") & " thaùng " & Format(Now(), "m") & " naêm " & Format(Now(), "yyyy")
Cells(i + 3, 7).Value = "Ngöôøi laäp bieåu"
Cells(i + 3, 19).Value = "Ngöôøi baùo caùo"
Cells(i + 7, 7).Value = "Laøm sao ñeå code ñònh daïng giaù trò naøy ôû giöõa cell haû baïn ?"
Cells(i + 7, 19).Value = "Traàn Thanh Taân"
'SetProtect
End Sub
Cám ơn bạn rất nhiều. Bạn chịu phiền cho tôi học hỏi thêm một tí nữa nhé!Chưa hiểu yêu cầu của bạn là gì cả. Cụ thể hơn đi.
Bạn xem lại sub Footer nhé.
Dòng i = Range("a1").Value + 1
Và bỏ các câu lệnh sum ở cột 11, 12, 13, 14.
PHP:Sub Footer() Dim i As Long i = Range("a1").Value + 1 Cells(i, 7).Value = "TOÅNG COÄNG:" Cells(i, 8).Value = "=counta(R8C8:R[-1]C) & R6C12" ' Cells(i, 11).Value = "=Sum(R8C11:R[-1]C)" ' Cells(i, 12).Value = "=Sum(R8C12:R[-1]C)" ' Cells(i, 13).Value = "=Sum(R8C13:R[-1]C)" ' Cells(i, 14).Value = "=Sum(R8C14:R[-1]C)" Cells(i, 16).Value = "=Sum(R8C16:R[-1]C)" Cells(i, 17).Value = "=Sum(R8C17:R[-1]C)" Cells(i, 18).Value = "=Sum(R8C18:R[-1]C)" Cells(i, 20).Value = "=Sum(R8C20:R[-1]C)" Cells(i + 2, 19).Value = "Quy Nhôn, ngaøy " & Format(Now(), "d") & " thaùng " & Format(Now(), "m") & " naêm " & Format(Now(), "yyyy") Cells(i + 3, 7).Value = "Ngöôøi laäp bieåu" Cells(i + 3, 19).Value = "Ngöôøi baùo caùo" Cells(i + 7, 7).Value = "Laøm sao ñeå code ñònh daïng giaù trò naøy ôû giöõa cell haû baïn ?" Cells(i + 7, 19).Value = "Traàn Thanh Taân" 'SetProtect End Sub
Sao không copy từ dòng 8 Sh NK sang Dòng 8 của sh Data luôn. Mà phải copy từ dòng 13.b) Tôi muốn "Move or copy..." NK thành Data (với số liệu như file đã gởi). Giả sử tôi nhập thêm NK 5 dòng nữa rồi click button (button ở trên NK) thì có thể tạo được code copy chỉ 5 dòng đó sang dòng tiếp theo ở Data mà không phải copy toàn bộ được không? (Nghĩa là mỗi khi có cái gì mới ở NK thì copy sang Data còn cái cũ thì không được overwrite)
Nếu được những điều nào trên, xin bạn hoặc các thành viên giúp tôi với! Chân thành cám ơn.
Sub copyData()
Dim endR As Long, eRow As Long
With Sheets("NK")
eRow = .Cells(65000, 1).End(xlUp).Row
End With
With Sheets("Data")
endR = .Cells(65000, 1).End(xlUp).Row
If eRow > endR Then
.Range(.Cells(endR, 1), .Cells(eRow, 28)).Value = Sheets("NK").Range(Cells(endR, 1), Cells(eRow, 28)).Value
End If
End With
End Sub
Dùng hàm indirect thủ,ví dụ copy sang A1:A4 thì như sau:Tôi muốn copy sang cột khác thành các cell liền kề từ các cell không liền kề nhưng chung một cột và cách dòng bằng nhau. Ví dụ: copy cell D4, D8, D12, D16, D20. Xin các bạn ai biết chỉ dùm. Cảm ơn.