- Tham gia
- 19/5/19
- Bài viết
- 116
- Được thích
- 9
Sub Them01KyTuAVoDau()
Dim Cls As Range, Rng As Range: Dim Tmr As Double
Set Rng = Range([B1], [B65500].End(xlUp)): Tmr = Timer()
For Each Cls In Rng
If IsNumeric(Cls.Value) And Cls.Value <> "" Then
Cls.Value = "A" & CStr(Cls.Value)
End If
Next Cls
MsgBox Timer() - Tmr
End Sub
Bài tập 1
PHP:Sub Them01KyTuAVoDau() Dim Cls As Range, Rng As Range: Dim Tmr As Double Set Rng = Range([B1], [B65500].End(xlUp)): Tmr = Timer() For Each Cls In Rng If IsNumeric(Cls.Value) And Cls.Value <> "" Then Cls.Value = "A" & CStr(Cls.Value) End If Next Cls MsgBox Timer() - Tmr End Sub
& buồn ngủ rồi, mai gặp lại & chúc ngủ ngon!
Sub Them01KyTuAVoDau()
On Error Resume Next
Dim Cls As Range, Rng As Range
Set Rng = Range("b1:b3000")
For Each Cls In Rng
If Cls.Value <> "" Then
Cls.Value = "A" & CStr(Cls.Value)
End If
Next Cls
End Sub
Sub xoa01KyTuAVoDau()
On Error Resume Next
Dim Cls As Range, Rng As Range
Set Rng = Range("b1:b3000")
For Each Cls In Rng
If Cls.Value <> "" Then
Cls.Value = Right(CStr(Cls.Value), Len(Cls.Value) - 1)
End If
Next Cls
End Sub
Sub Xoa01KyTuODauDeChuyenThanhSo()
Dim Cls As Range, Rng As Range: Dim Tmp
Set Rng = Range([b2], [B2345].End(xlUp))
For Each Cls In Rng
Tmp = Mid$(Cls.Value, 2, Len(Cls.Value))
If IsNumeric(Tmp) Then
Cls.Value = CLng(Tmp)
Else
Cls.Interior.ColorIndex = 38
End If
Next Cls
End Sub
Tôi nghĩ có thể làm thủ công thế này:Chào cả nhà GPE ! em cần 2 đoạn code
-Thêm 1 ký tự vào bên trái ngoài cùng
- Xóa 1 ký tự bên trái ngoài cùng
Dữ liệu em tầm 2000 dòng. Mong mấy bác giúp code chạy nhanh nhanh tí. Hiện em đang dùng công thức thấy bảng tính chậm quá. Xin cảm ơn
View attachment 230753
Sub BienSoLieuNgayThanhChuoi()
Dim Rws As Long
Dim Rng As Range, Cls As Range
Set Rng = Range([B3], [B2345].End(xlUp))
For Each Cls In Rng
If IsDate(Cls.Value) Then
Cls.Value = "G" & DateToTxt(Cls.Value)
Else
Cls.Interior.ColorIndex = 38
End If
Next Cls
End Sub
Function DateToTxt(Dat As Date) As String
Const FC As String = "/"
Dim StrC As String
StrC = Right("0" & CStr(Day(Dat)), 2) & FC & Right("0" & CStr(Month(Dat)), 2) & FC & CStr(Year(Dat))
DateToTxt = StrC
End Function
BT2: Bạn tham khảo thêm cái này:
PHP:Sub Xoa01KyTuODauDeChuyenThanhSo() Dim Cls As Range, Rng As Range: Dim Tmp Set Rng = Range([b2], [B2345].End(xlUp)) For Each Cls In Rng Tmp = Mid$(Cls.Value, 2, Len(Cls.Value)) If IsNumeric(Tmp) Then Cls.Value = CLng(Tmp) Else Cls.Interior.ColorIndex = 38 End If Next Cls End Sub
Tôi nghĩ có thể làm thủ công thế này:
1/ Chọn vùng chứa dữ liệu rồi click phải chọn Format Cells > Custom vào khung Type cho cái định dạng này vào
"A"dd"/"mm"/"yyyy
2/ Muốn bỏ chữ A thì chọn vùng chứa dữ liệu rồi click phải chọn Format Cells chọn thẻ Number > Date rồi làm như hình.
View attachment 230767
[/QUOTE
dạ em làm cái này để em quy đổi nó thành text để lưu vào bộ nhớ tạm với nhiều thành phần khác nữa bác. Còn cách của bác chỉ hiển thị cho ta thấy thôi chứ khi copy paste đi chổ khác thì chử A nó đâu có
Sub Them01KyTuAVoDau()
On Error Resume Next
Dim Cls As Range, Rng As Range
Set Rng = Range("b1:b3000")
For Each Cls In Rng
If Cls.Value <> "" Then
Cls.Value = "A" & CStr(Cls.Value)
End If
Next Cls
End Sub
Sub xoa01KyTuAVoDau()
On Error Resume Next
Dim Cls As Range, Rng As Range
Set Rng = Range("b1:b3000")
For Each Cls In Rng
If Cls.Value <> "" Then
Cls.Value = DateToTxt(Right(CStr(Cls.Value), Len(Cls.Value) - 1))
End If
Next Cls
End Sub
PHP:Sub BienSoLieuNgayThanhChuoi() Dim Rws As Long Dim Rng As Range, Cls As Range Set Rng = Range([B3], [B2345].End(xlUp)) For Each Cls In Rng If IsDate(Cls.Value) Then Cls.Value = "G" & DateToTxt(Cls.Value) Else Cls.Interior.ColorIndex = 38 End If Next Cls End Sub
Mã:Function DateToTxt(Dat As Date) As String Const FC As String = "/" Dim StrC As String StrC = Right("0" & CStr(Day(Dat)), 2) & FC & Right("0" & CStr(Month(Dat)), 2) & FC & CStr(Year(Dat)) DateToTxt = StrC End Function
Cụ thể bài 5 làm thủ công như vậy có đáp ứng yêu cầu không?Code không chạy được bác ơi
.............................................................................
Cụ thể code chạy thêm chử A là OK. còn code xóa đi chữ A thì nó lại làm sai giá trị ( ví dụ A1/8/2019 thì sau khi bỏ chử A nó lại thành 8/1/2019 )
.............................................................................
bác kiểm tra lại giúp em. Em cảm ơn nhiều
Cụ thể code chạy thêm chử A là OK. còn code xóa đi chữ A thì nó lại làm sai giá trị ( ví dụ A1/8/2019 thì sau khi bỏ chử A nó lại thành 8/1/2019 )
Cụ thể bài 5 làm thủ công như vậy có đáp ứng yêu cầu không?
Nếu bạn thấy như vậy là áp dụng được thì mới tính đến code.
Như thế nào là không chạy được?Code không chạy được bác ơi
....
Sau khi chạy code Them01KyTuAVoDau Nối chữ A vào thì nó Ok
View attachment 230758
và em muốn Xóa đi Chử A ( chạy code xoa01KyTuAVoDau) ban đầu để trở về giá trị ban đầu thì những ngày nào nhỏ hơn ngày 10 thì nó bị ngược ngày tháng năm. ( Ví dụ ban đầu 1/8/2020 thì sau thêm chử A thì nó thành --> A1/8/2020 và sau khi bỏ chữ A thì nó lại thành --> 8/1/2020. Mà đáng lý ra phải là 1/8/2020 )
Anh lại không để ý chủ thớt là ai rồi.Tôi nghĩ bạn nên đưa bài toán tổng thể của bạn là gì rồi mọi người góp ý giải pháp xử lý khác có thể sẽ tốt hơn. Tôi thấy yêu cầu của bạn thêm ký tự gì đó vào nguồn dữ liệu có sẳn rồi sau đó lại xoá đi trả dữ liệu về như cũ để giải quyết một công việc tính toán gì đó của bạn nó sai với việc quản lý dữ liệu quá. Dữ liệu nguồn là không đổi, bạn chỉ có thể thêm các cột phụ để xử lý chứ ai đâu đi sửa dữ liệu nguồn rồi trả về như cũ, nếu trong quá trình chạy nó phát sinh lỗi gì đó thì dữ liệu nguồn bị hư, không còn tin cậy được nữa thì sao.
Code chạy được nhưng nó sai , nó vẫn 1/8/2019 sau khi bỏ ký tự bên trái nó lại 8/1/2019Như thế nào là không chạy được?
(1) Mở Code ra, nhấn {F5} là nó chạy chứ sao không chạy được.
Tạm biệt bạn!![]()
Tôi nghĩ bạn nên đưa bài toán tổng thể của bạn là gì rồi mọi người góp ý giải pháp xử lý khác có thể sẽ tốt hơn. Tôi thấy yêu cầu của bạn thêm ký tự gì đó vào nguồn dữ liệu có sẳn rồi sau đó lại xoá đi trả dữ liệu về như cũ để giải quyết một công việc tính toán gì đó của bạn nó sai với việc quản lý dữ liệu quá. Dữ liệu nguồn là không đổi, bạn chỉ có thể thêm các cột phụ để xử lý chứ ai đâu đi sửa dữ liệu nguồn rồi trả về như cũ, nếu trong quá trình chạy nó phát sinh lỗi gì đó thì dữ liệu nguồn bị hư, không còn tin cậy được nữa thì sao.
(1) Chạy được mà sai khác hoàn toàn với không chạy được.Code chạy được nhưng nó sai , nó vẫn 1/8/2019 sau khi bỏ ký tự bên trái nó lại 8/1/2019
1. Không dùng nối chuỗi, và không dùng mặc định "/" vì khi chạy code trên máy có thiết lập khác thì sẽ sai.Code chạy được nhưng nó sai , nó vẫn 1/8/2019 sau khi bỏ ký tự bên trái nó lại 8/1/2019
Sub Them01KyTuAVoDau()
Dim Cls As Range, Rng As Range
Set Rng = Range("b3:b3000")
For Each Cls In Rng
If Cls.Value <> "" Then
Cls.Value = "A" & Cls.Value
End If
Next Cls
End Sub
Sub xoa01KyTuAVoDau()
Dim Cls As Range, Rng As Range
Set Rng = Range("b3:b3000")
For Each Cls In Rng
If Len(Cls.Value) > 1 Then
Cls.Value = CDate(Mid(Cls.Value, 2))
End If
Next Cls
End Sub
1. Không dùng nối chuỗi, và không dùng mặc định "/" vì khi chạy code trên máy có thiết lập khác thì sẽ sai.
2. Khi đã thêm "A" ở đầu thì phải chấp nhận là dạng kết quả sẽ tùy thuộc system. Bạn có thiết lập trong CP là dd/MM/yyyy thì bạn nhìn thấy ngày tháng là 01/08/2020, và khi thêm A thì có A01/08/2020. Nhưng tôi có thiết lập yyyy-MM-dd thì tôi mong đợi phải có 2020-08-01, và khi thêm A tôi mong đợi có A2020-08-01.
Nếu bạn muốn khi chạy code1 thì từ 01/08/2020 (2020-08-01) sẽ có A01/08/2020 (A2020-08-01), và khi chạy code2 thì lại có 01/08/2020 (2020-08-01) - tức ngày tháng thực sự và không bị đảo lộn, thì hãy sửa code của bác SA_DQ thành
Mã:Sub Them01KyTuAVoDau() Dim Cls As Range, Rng As Range Set Rng = Range("b3:b3000") For Each Cls In Rng If Cls.Value <> "" Then Cls.Value = "A" & Cls.Value End If Next Cls End Sub Sub xoa01KyTuAVoDau() Dim Cls As Range, Rng As Range Set Rng = Range("b3:b3000") For Each Cls In Rng If Len(Cls.Value) > 1 Then Cls.Value = CDate(Mid(Cls.Value, 2)) End If Next Cls End Sub
(1) Chạy được mà sai khác hoàn toàn với không chạy được.
(2) Đừng cố thử với 1/8/20.. Mà nên thử chí ít với 1/13/2019 Hay 18/10/2019
Thử như bạn thì đến mùng thất cũng cho là người khác sai, còn bản thân mình thì chưa được thỏa iêu cầu đề ra!
Tệ quá xá & chắc đây là bài cuối của mình với bạn!
Các bạn kiên nhẫn thật....
Tệ quá xá & chắc đây là bài cuối của mình với bạn!
Quán Tự Tại thực hành trí tuệ,Các bạn kiên nhẫn thật.
- Thớt này, đúng như lời ở bài #12, đang làm một (hoặc vài) dự án có liên quan đến VBA.
- Những gì thớt hỏi chỉ là vấn đề giả định và nhất thời (nông nổi). Vì nó giả định và nhất thời cho nên thớt không thể lường trước những kết quả, chỉ thấy không giống ý mình thì la lên "không chạy, sai,..."
- Thớt không bao giờ giải thích rõ ràng vấn đề của mình. Bởi vì theo thớt, các vấn đề này là nhạy cảm, là sở hữu trí tuệ của thớt, một khi trình bày rõ ra sẽ bị người khác "ăn cắp".
- Thớt không bao giờ có kiên nhẫn để lý luận với bạn. Chỉ có đúng/sai, đúng 100%, sai 100%. Hay thỉnh thoảng đúng 90% (chả biết chỉ tiêu lấy ở đâu ra).
Kết luận, tôi thì gặp mấy bài này thích thì làm chơi cho vui thôi chứ không không buồn chỉnh sửa. Các yêu cầu của thớt nó đặc thù quá, chả giúp ích gì cho người khác. (và cũng có thể đó là chủ đích của thớt)
A-di-đà Phật sắc thân vàng,Mô phật, cha mẹ của thầy tu cũng không ăn chay mới có thầy đó ạ!
/(/ếu ngược lại thì thầy sao tồn tại trên đời để đi tu (?)
1. Không dùng nối chuỗi, và không dùng mặc định "/" vì khi chạy code trên máy có thiết lập khác thì sẽ sai.
2. Khi đã thêm "A" ở đầu thì phải chấp nhận là dạng kết quả sẽ tùy thuộc system. Bạn có thiết lập trong CP là dd/MM/yyyy thì bạn nhìn thấy ngày tháng là 01/08/2020, và khi thêm A thì có A01/08/2020. Nhưng tôi có thiết lập yyyy-MM-dd thì tôi mong đợi phải có 2020-08-01, và khi thêm A tôi mong đợi có A2020-08-01.
Nếu bạn muốn khi chạy code1 thì từ 01/08/2020 (2020-08-01) sẽ có A01/08/2020 (A2020-08-01), và khi chạy code2 thì lại có 01/08/2020 (2020-08-01) - tức ngày tháng thực sự và không bị đảo lộn, thì hãy sửa code của bác SA_DQ thành
Mã:Sub Them01KyTuAVoDau() Dim Cls As Range, Rng As Range Set Rng = Range("b3:b3000") For Each Cls In Rng If Cls.Value <> "" Then Cls.Value = "A" & Cls.Value End If Next Cls End Sub Sub xoa01KyTuAVoDau() Dim Cls As Range, Rng As Range Set Rng = Range("b3:b3000") For Each Cls In Rng If Len(Cls.Value) > 1 Then Cls.Value = CDate(Mid(Cls.Value, 2)) End If Next Cls End Sub
Các bạn kiên nhẫn thật.
- Thớt này, đúng như lời ở bài #12, đang làm một (hoặc vài) dự án có liên quan đến VBA.
- Những gì thớt hỏi chỉ là vấn đề giả định và nhất thời (nông nổi). Vì nó giả định và nhất thời cho nên thớt không thể lường trước những kết quả, chỉ thấy không giống ý mình thì la lên "không chạy, sai,..."
- Thớt không bao giờ giải thích rõ ràng vấn đề của mình. Bởi vì theo thớt, các vấn đề này là nhạy cảm, là sở hữu trí tuệ của thớt, một khi trình bày rõ ra sẽ bị người khác "ăn cắp".
- Thớt không bao giờ có kiên nhẫn để lý luận với bạn. Chỉ có đúng/sai, đúng 100%, sai 100%. Hay thỉnh thoảng đúng 90% (chả biết chỉ tiêu lấy ở đâu ra).
Kết luận, tôi thì gặp mấy bài này thích thì làm chơi cho vui thôi chứ không không buồn chỉnh sửa. Các yêu cầu của thớt nó đặc thù quá, chả giúp ích gì cho người khác. (và cũng có thể đó là chủ đích của thớt)