Các cao nhân giúp e sửa lỗi "Run -time error'1004': Method 'Range' of object '_worksheet' failed"

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Tìm hiểu ", "", """, """"
Em thay lần lượt vào đuôi thì ra, nhưng chưa tìm được lý thuyết về mấy dấu nháy này.

Tác giả có thể thay cái này vào nếu muốn (phẩy và nháy kép kép):
.Range("B8") = "=IFERROR(VLOOKUP(B7,'danh sach'!$G$2:$H$259,2,0),"""")"
 
Chuỗi thì phải bỏ vào 1 cặp nháy nháy đôi
" cũng là 1 chuỗi, nên """
"" cũng là 1 chuỗi. nên """"

Cần gì lý thuyết đao to búa lớn.
Cái khó hiểu ở đây là em đang hiểu toàn bộ công thức nó là 1 chuỗi duy nhất, rồi gán cái chuỗi công thức xuống ô. Vậy nên em nghĩ chỉ cần bao trùm toàn bộ chuỗi trong 1 cặp nháy là đủ.

Khi viết công thức excel thì """, hay """" cũng thi thoảng em gặp, nhưng là để trả kết quả là text có dấu ". Cái này thì rõ ràng rồi.

Vấn đề giờ là phải thêm 4 nháy riêng vào, vậy nghĩa là máy tính phải đọc từng ký tự, rồi khi gặp """", nó mới hiểu được là 2 nháy. Thế thì lẽ ra ' cũng phải được đặt trong " ' " và cả dấu ( , : !, ... cũng phải đặt riêng trong cặp "" riêng biệt.
Cái này mới cần lý thuyết vì nó hơi xa so với cách hiểu thông thường của em, bác ạ.
 
Lần chỉnh sửa cuối:
Cái khó hiểu ở đây là em đang hiểu toàn bộ công thức nó là 1 chuỗi duy nhất, rồi gán cái chuỗi công thức xuống ô. Vậy nên em nghĩ chỉ cần bao trùm toàn bộ chuỗi trong 1 cặp nháy là đủ.

Nếu gắn "=If(A1 = "",1,0)" vào B1 thì xảy ra chuyện gì? Làm sao VBA phân biệt " nào là bọc chuỗi và " nào chính là chuỗi?

' cũng là chuỗi, và cũng cần bỏ vào trong "" như thường.
Nếu ' nằm đơn lẻ và cần nối vào đâu đó thì nó là chuỗi, và cần "'", chẳng hạn TenSheet là 1 biến:
TenSheet = "Tháng 10"
thamchieu = "'" & TenSheet & "'!A1"

Nếu ' nằm trong chuỗi tên sheet như tham chiếu 'Tháng 10'!A1, thì nguyên cục đó là chuỗi rồi, cần "'Tháng 10'!A1" chứ cần gì tách ra rồi nối vào.
 
Lần chỉnh sửa cuối:
Em hiểu thế này:
[B1] = "LAY CHUOI LOT TRONG NHAY"
Kết quả ------------> LAY CHUOI LOT TRONG NHAY

vậy thì:
gắn "=If(A1 = "",1,0)" vào B1
[B1] = "=If(A1 = "",1,0)"
Kết quả ------------> =If(A1 = "",1,0) nghĩa là lấy chuỗi lọt trong nháy. Nhưng không được, lỗi, sửa 4 nháy thì được.

Có thể cái này phải hiểu 1 cách gượng ép đó là quy ước.

Và thử cái này với Immediate (2 3 4 5 6 nháy kép):
[B1] = "" & """ & """" & """"" & """"""
Kết quả ------------> " & "" & """"
Thật là đau lòng con cuốc cuốc và không biết & là & nào và nháy " là nháy " nào luôn bác ạ.
 
Nhiều chuyện thần bí lắm. Giả sử muốn có công thức:
=If(A1="",<một nháy đôi>,1)

Gõ công thức phải thế này: =If(A1="","""",1)

1700717462543.png

Thử record ra xem.
[B1] = "" & """ & """" & """"" & """"""
Kết quả ------------> " & "" & """"

Phải đọc nguyên câu và đọc đúng nguyên tắc.

Thí dụ câu:
Đoàn người đi, cantl đi trên đầu đội nón lá dưới chân mang dép lê ngang lưng đeo bị gạo trên cổ đeo gông xuống dốc cầu

Đọc nguyên câu hay đọc cà nhắc kiểu:

Đoàn người đi,
cantl đi trên đầu
đội nón lá dưới chân
mang dép lê ngang lưng
đeo bị gạo trên cổ
đeo gông xuống dốc cầu
 
Nhiều chuyện thần bí lắm. Giả sử muốn có công thức:
=If(A1="",<một nháy đôi>,1)

Gõ công thức phải thế này: =If(A1="","""",1)

View attachment 296960

Thử record ra xem.


Phải đọc nguyên câu và đọc đúng nguyên tắc.

Thí dụ câu:
Đoàn người đi, cantl đi trên đầu đội nón lá dưới chân mang dép lê ngang lưng đeo bị gạo trên cổ đeo gông xuống dốc cầu

Đọc nguyên câu hay đọc cà nhắc kiểu:

Đoàn người đi,
cantl đi trên đầu
đội nón lá dưới chân
mang dép lê ngang lưng
đeo bị gạo trên cổ
đeo gông xuống dốc cầu
Em thấy lỗi sai của mình rồi ạ. E cám ơn các anh, chị nhiều lắm ạ.
Bài đã được tự động gộp:

Sửa code của bài 1 nhé:

Option Explicit
Sub Luuvaodata()
Dim lr As Long, i As Long
'Kiem tra dieu kien
For i = 5 To 17
If Shfrom.Range("F" & i).Value = False Then
MsgBox Shfrom.Range("H" & i).Value
Shfrom.Range("B" & i).Select
Exit Sub
End If
Next i
'Luu vao data
With shdata
lr = .Range("A" & Rows.Count).End(xlUp).Row + 1
Shfrom.Range("AA6:AM6").Copy 'copy
.Range("A" & lr).PasteSpecial xlPasteValues 'paste
Application.CutCopyMode = False
reset 'xoa nhap lai tu dau
MsgBox "Xong!"


End With

End Sub
Sub reset()
With Shfrom
.Range("b6:b16").ClearContents
.Range("B5") = "=MAX('data Ke toan'!A:A)+1"
.Range("B8") = "=c8" (*---*)
' .Range("B8") = "=IFERROR(VLOOKUP(B7;'danh sach'!$G$2:$H$259;2;0);"")"
'công thức này nhét sẵn vào ô C8, để cho (*---*) chạy được (chỉ là chữa cháy thôi)
End With
End Sub
Bài đã được tự động gộp:


bác thường giải thích cho em cái vụ công thức báo lỗi với ạ.

Tại sao xảy ra bác

Sửa code của bài 1 nhé:

Option Explicit
Sub Luuvaodata()
Dim lr As Long, i As Long
'Kiem tra dieu kien
For i = 5 To 17
If Shfrom.Range("F" & i).Value = False Then
MsgBox Shfrom.Range("H" & i).Value
Shfrom.Range("B" & i).Select
Exit Sub
End If
Next i
'Luu vao data
With shdata
lr = .Range("A" & Rows.Count).End(xlUp).Row + 1
Shfrom.Range("AA6:AM6").Copy 'copy
.Range("A" & lr).PasteSpecial xlPasteValues 'paste
Application.CutCopyMode = False
reset 'xoa nhap lai tu dau
MsgBox "Xong!"


End With

End Sub
Sub reset()
With Shfrom
.Range("b6:b16").ClearContents
.Range("B5") = "=MAX('data Ke toan'!A:A)+1"
.Range("B8") = "=c8" (*---*)
' .Range("B8") = "=IFERROR(VLOOKUP(B7;'danh sach'!$G$2:$H$259;2;0);"")"
'công thức này nhét sẵn vào ô C8, để cho (*---*) chạy được (chỉ là chữa cháy thôi)
End With
End Sub
Bài đã được tự động gộp:


bác thường giải thích cho em cái vụ công thức báo lỗi với ạ.

Tại sao xảy ra bác nhẩy?
Cảm ơn bác nhiều lắm lắm luôn ạ ><
 
Kết quả ------------> LAY CHUOI LOT TRONG NHAY
đúng là như thế. Và trong vba quy định thêm về việc tạo chuỗi hằng số là 1 dấu nháy kép sẽ được viết là 2 dấu nháy kép. Quy tắc này chỉ đúng khi định nghĩa chuỗi hằng số.

A="abc"123" sẽ lỗi vì khi dịch tới dấu " thứ 2 vba thấy ký tự kế tiếp không phải là 1 nháy kép. Nó nghĩ đó là dấu hiệu của việc kết thúc định nghĩa chuỗi "abc". Và 123" trở thành vô duyên không có nghĩa.
A="abc""123" thì "" sẽ được hiểu là 1 nháy kép. Kết quả a là:abc"123

Thế còn a="abc"" thì sẽ như nào thì bạn tự tìm hiểu
 
Hệ thống tuyên truyền của Trung Quốc quá hay, nhiều bạn trẻ Việt Nam chạy theo dùng tiếng Trung Quốc dần bỏ quên ngôn ngữ thuần Việt!
"Cao nhơn" là tiếng Hán Việt , tiếng Hán viết theo chữ Việt
Nhiều người quan niệm "không thích thì cứ bỏ qua, phê phán mà chi"

Theo nguyên tắc "vàng xấu sẽ đẩy vàng tốt ra khỏi thị trường".
Nếu cứ mặc mấy cái từ "tiên tiếc" ấy thì không bao lâu sẽ thấy diễn đàn toàn là:
Nhờ cao nhơn..., Các cao thủ giúp e..., Thưa các tiền bối...

Rõ ràng là gần đây, đám này càng lúc càng nhiều.

Bạn vào đám côn đồ nói chuyện một thời gian sẽ có khả năng chính mình nói chêm tiếng chửi thề.
 
Nhiều người quan niệm "không thích thì cứ bỏ qua, phê phán mà chi"

Theo nguyên tắc "vàng xấu sẽ đẩy vàng tốt ra khỏi thị trường".
Nếu cứ mặc mấy cái từ "tiên tiếc" ấy thì không bao lâu sẽ thấy diễn đàn toàn là:
Nhờ cao nhơn..., Các cao thủ giúp e..., Thưa các tiền bối...

Rõ ràng là gần đây, đám này càng lúc càng nhiều.

Bạn vào đám côn đồ nói chuyện một thời gian sẽ có khả năng chính mình nói chêm tiếng chửi thề.
Hồi nhỏ trước nhà mình là chợ cá, kế đó là trại gia binh, chửi thề là câu cửa miệng. Lên Sài Gòn sống trong ký túc xá gần chợ cầu muối, anh em phải đoàn kết và tỏ ra cứng mới không bị ăn hiếp, nhưng trong giao tiếp dần lịch sự hơn.
 
Sau khi mò mẫm và thử dần, thì em đoán kết quả là thế này.
Có vẻ đúng chứ em không chắc lắm.
1700796061671.png
 
Theo đúng luật thì dấu " ở đầu là mở đầu chuỗi, và dấu " cuối cùng dùng để kết chuỗi.
Để có thể nhét dấu " vào giữa chuỗi, hầu hết các ngôn ngữ có thêm lệ rằng bên trong chuỗi, cứ hai dấu " liên tiếp thì coi như là một dấu " nằm trong chuỗi.

Trình dịch (compiler) có giới hạn lô gic của nó. Nếu bạn cố tình làm rắc rối thì nó sẽ báo lỗi không dịch được, hoặc bắt buộc phải đoán. Cái "đoán" của nó là cái bạn cần tránh. Cứ tránh cho chắc ăn, không rầy rà tìm hiểu thêm.

Tôi cứ theo nguyên tắc "rắc rối thì chia để trị", ngắt ra từng đoạn để kiểm soát.
 
Bài 27 tôi có đưa 1 ví dụ, thì đã thấy trong công thức nó khác khác rồi, không phải 1 dấu " bỏ trong 1 cặp dấu " là 3 dấu, mà phải 4 dấu mới chịu.

1700840480680.png

Tôi có nói thử record macro công thức ấy, nhưng chắc cantl chưa làm. Làm rồi sẽ thấy mọi giải thích bên trên nên quên đi, và làm theo bài 33, 34

Kết quả record là 8 dấu! Thử trong Imediate câu sau sẽ được như hình trên.

Range("B1").Formula = "=If(A1="""","""""""",0)"
 
Lần chỉnh sửa cuối:
Bài 27 tôi có đưa 1 ví dụ, thì đã thấy trong công thức nó khác khác rồi, không phải 1 dấu " bỏ trong 1 cặp dấu " là 3 dấu, mà phải 4 dấu mới chịu.

View attachment 297049

Tôi có nói thử record macro công thức ấy, nhưng chắc cantl chưa làm. Làm rồi sẽ thấy mọi giải thích bên trên nên quên đi.

Kết quả record là 8 dấu! Thử trong Imediate câu sau sẽ được như hình trên.

Range("B1").Formula = "=If(A1="""","""""""",0)"
Chưa record bác ạ. Bằng kỹ thuật mò mẫm đỉnh cao thì:
- Trong sheet, quy tắc là dấu nháy đầu tiên luôn là mở chuỗi.
+ Sau mà chỉ có 1 nháy duy nhất thì đóng chuỗi. VD "" (mở+1) là rỗng.
+ Sau mà 2 nháy cạnh nhau thì biến thành 1 nháy (nháy là TEXT chứ không phải nháy). VD """ (mở+2) là " nhưng vì thiếu " đóng chuỗi nên sẽ lỗi. Đủ là phải 4 nháy để có mở, có nháy TEXT, có đóng chuỗi. VD """" -> ".
Ảnh vẽ trên là minh họa cho cái tưởng tượng này.


- Trong VBA,
+ Chuỗi luôn được đặt trong ngoặc kép mở và đóng chuỗi.
+ Nếu hiểu " là TEXT thì luôn luôn phải gấp đôi. VD 100 nháy kép thì kết quả trả về cells sẽ là 50 nháy TEXT.
Immediate của bác là minh họa ý này. 4/2 và 8/2 nháy.
 
Đã nói quý vị nên tránh trường hợp trình dịch cố diễn để tránh lỗi.
Cái nào rắc rói thì hãy để dấu ngoặc giúp cho.

1700844395685.png

Biểu thức 2 và 4 ngắn hơn biểu thức 1 và 3 một dấu ".
Biểu thức 3, compile nghiêm chỉnh bởi dấu () sẽ cho ra đúng như ý.
Biểu thức 4, compile nghiêm chỉnh sẽ lòi ra là nó thiếu 1 dấu ", VBA phản đối.
 
Web KT
Back
Top Bottom