Phân biệt ký tự

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại em đang bắt gặp rất nhiều ký tự xuống dòng mà không biết cái nào dùng trong trường hợp nào .
Các ký tự xuống dòng đã bắt gặp:
1: Chr(10)
2: vbNewLine
3: vbCrLf
4: vbCr
5: Chr(13)
Các anh chị giúp em phân biệt "chúng nó" khác và giống nhau chỗ nào với ạ ^^ . Em cảm ơn các anh chị nhiều
 
Em chào các anh chị ^^
Hiện tại em đang bắt gặp rất nhiều ký tự xuống dòng mà không biết cái nào dùng trong trường hợp nào .
Các ký tự xuống dòng đã bắt gặp:
1: Chr(10)
2: vbNewLine
3: vbCrLf
4: vbCr
5: Chr(13)
Các anh chị giúp em phân biệt "chúng nó" khác và giống nhau chỗ nào với ạ ^^ . Em cảm ơn các anh chị nhiều
Constant Value Description
----------------------------------------------------------------
vbCr Chr(13) Carriage return
vbCrLf Chr(13) & Chr(10) Carriage return–linefeed combination
vbLf Chr(10) Line feed
---------------
Bạn Test thử:
MsgBox("Hai" & vbLf & "Welcome")
MsgBox ("Hai" & vbCrLf & "Welcome")
MsgBox("Hai" & vbCr & "Welcome")
Kết quả: đều cho ra cùng một kết quả ?
  • vbCr : - quay trở lại dòng đầu
  • vbCrLf : tương tự như cách nhấn Enter
  • vbLf : - chuyển đến dòng tiếp theo
***********************************
Ba hằng số ngày nay có các chức năng tương tự nhau, nhưng có nguồn gốc lịch sử khác nhau và đôi khi bạn có thể được yêu cầu sử dụng hằng số này hoặc hằng số kia.

Bạn cần phải nghĩ lại những ngày của máy đánh chữ thủ công cũ để biết được nguồn gốc của điều này. Có hai hành động riêng biệt cần thiết để bắt đầu một dòng văn bản mới:

  1. di chuyển đầu gõ trở lại bên trái. Trong thực tế trong máy đánh chữ, điều này được thực hiện bằng cách di chuyển cuộn mang giấy ("toa") về phía bên phải - đầu đánh máy được cố định. Đây là một trở về vận chuyển .
  2. di chuyển tờ giấy lên theo chiều rộng của một dòng. Đây là một nguồn cấp dữ liệu dòng .
Trong máy tính, hai hành động này được biểu diễn bằng hai ký tự khác nhau - ký tự xuống dòng là CR, ký tự ASCII 13 , vbCr; nguồn cấp dữ liệu dòng là LF, ký tự ASCII 10 , vbLf. Ngày xưa của máy in dòng và máy in từ xa, máy in cần phải gửi hai ký tự này - theo truyền thống trong chuỗi CRLF- để bắt đầu một dòng mới, và do đó, CRLFsự kết hợp - vbCrLf- trở thành chuỗi kết thúc dòng truyền thống, trong một số môi trường máy tính.

Tất nhiên, vấn đề là ở chỗ, việc chỉ sử dụng một ký tự để đánh dấu dòng kết thúc cũng rất hợp lý và để thiết bị đầu cuối hoặc máy in thực hiện cả hành động xuống dòng và cấp dòng tự động. Và vì vậy trước khi bạn biết điều đó, chúng ta có 3 phần cuối dòng hợp lệ khác nhau: LFmột mình (được sử dụng trong Unix và Macintoshes), CRmột mình (dường như được sử dụng trong các hệ điều hành Mac cũ hơn) và CRLFkết hợp (được sử dụng trong DOS và do đó trong Windows). Điều này dẫn đến sự phức tạp của các chương trình DOS / Windows có tùy chọn mở tệp trong text modeđó bất kỳ CRLFcặp nào được đọc từ tệp đều được chuyển đổi thành một tệp duy nhất CR(và ngược lại khi viết).

Vì vậy - để cắt ngắn (quá nhiều) một câu chuyện dài - có những lý do lịch sử cho sự tồn tại của ba dấu phân cách dòng riêng biệt, mà bây giờ thường không liên quan: và có lẽ cách hành động tốt nhất trong .NET là sử dụng Environment.NewLinenghĩa là người khác đã quyết định cho bạn sẽ sử dụng cái nào và các vấn đề về tính di động trong tương lai sẽ được giảm bớt.
 
Upvote 0
Em cảm ơn anh nhiều lắm ^^ .
Em thấy bài của anh từ lúc chiều rồi nhưng mà do thời gian học VBA của em đã hết nên em sẽ đọc bài của anh vào sáng mai xong có gì em sẽ báo anh sau ạ .
Cảm ơn anh đã dành thời gian đọc và giải thích giúp em
 
Upvote 0
Tất cả ký tự này đều dùng để xác định vị trí con trỏ văn bản và hiển thỉ văn bản xuống dòng theo mắt người nhìn thấy và phân biệt được:
1. vbCr là chr(13) - Sử dụng trong xử lý văn bản
2. vbLf là chr(10) - Ví dụ sử dụng trong ô Excel, ô chỉ có thể chứa giá trị này
3. vbNewLine là vbCrLf là chr(13) + chr(10) - Ví dụ sử dụng dán giá trị thành dạng bảng trong Excel, nó có chức năng tách dòng Excel
Ví dụ: "a" & vbLF & "b" & vbCrLF "c" & vbLF & "d", khi dán (Ctrl+V) vào ô Excel bạn sẽ được như sau:

a
b
c
d

Nhưng nếu bạn dán với dạng văn bản thuần tý vào ô thì vbCrLf sẽ từ động được chuyển thành vbLf, sẽ thành:

a
b
c
d

vbNewLine trong VBA thường dùng hơn vì nó cho phép tương thích nền tảng Window hay MACOS, nếu bạn viết ứng dụng 2 nền tảng cùng lúc.

 
Upvote 0
Ví dụ: "a" & vbLF & "b" & vbCrLF "c" & vbLF & "d", khi dán (Ctrl+V) vào ô Excel bạn sẽ được như sau:

a
b
c
d

Nhưng nếu bạn dán với dạng văn bản thuần tý vào ô thì vbCrLf sẽ từ động được chuyển thành vbLf, sẽ thành:

a
b
c
d

vbNewLine trong VBA thường dùng hơn vì nó cho phép tương thích nền tảng Window hay MACOS, nếu bạn viết ứng dụng 2 nền tảng cùng lúc.

Ý của anh có phải muốn nói như sau không ạ ^^ Anh vào kiểm chứng giúp em với :>
  1. vbCr là chr(13)
  2. vbLf là chr(10)
  3. vbNewLine là vbCrLf là (chr(13) + chr(10))
Ví du:
1653512357120.png
Nhận Xét:
Tất cả vbCr và vbLr và vbNewLine chỉ khác nhau lúc gán xuống cell trên excel (vbcr không có tác dụng) còn lúc gán vào văn bản thì không ( đều có tác dụng)
 

File đính kèm

  • phanbietxuongdong.xlsm
    15.2 KB · Đọc: 4
Upvote 0
Anh vào kiểm chứng giúp em với :>
  1. vbCr là chr(13)
  2. vbLf là chr(10)
  3. vbNewLine là vbCrLf là (chr(13) + chr(10))
Thế bạn không tự kiểm tra được?
Mã:
Debug.Print vbCr = Chr(13)
Debug.Print vbLf = Chr(10)
Debug.Print vbNewLine = vbCrLf
Debug.Print vbCrLf = vbCr & vbLf

Những gì tự mình làm được thì không nhờ, còn những gì tự kiểm nghiệm được thì không hỏi.
 
Upvote 0
À không ạ :> Em không nhờ anh ấy kiểm tra hộ phần đó:
  1. vbCr là chr(13)
  2. vbLf là chr(10)
  3. vbNewLine là vbCrLf là (chr(13) + chr(10))
Cái phần này là em copy lời của anh ấy vào bài của em . Cái em cần anh ấy kiểm tra đó là xem phần dưới(cái mà em viết đặc biệt là lời nhận xét) đã đúng với ý của anh ấy chỉ cho em chưa ấy anh . Em có trích phần em muốn kiểm tra ở đầu bài viết #5 ấy anh :>
 
Upvote 0
Thử thì phải đưa vào clipboard sau đó dùng phím tắt dán, chứ sao bạn lại gán trực tiếp

Xử lý văn bản vbCr thường tác dụng với ứng dụng Word nhé bạn
 
Upvote 0
Thử thì phải đưa vào clipboard sau đó dùng phím tắt dán
Em không biết đưa vào clipboard kiểu gì . Anh đưa thử cho em coi với ^^
chứ sao bạn lại gán trực tiếp
Em biết nói sao giờ nhỉ ! Kiểu em đang cố phân biệt giữa hai trường hợp
khi dùng các ký tự xuống dòng đó lúc muốn gán một đoạn văn bản xuống sheet và khi dùng các ký tự đó lúc đang ở trong một đoạn văn bản
 
Upvote 0
Em vào MSWord á, chọn một đoạn văn bản, chọn canh đều (Justify). Sau đó đưa con trỏ vào giữa đoạn văn bản, rồi:
OP1: gõ Shift + Enter.
OP2: gõ Enter
thì sẽ hiểu tại sao họ đưa ra các thứ có vẻ trùng lặp lộn xộn như vậy.
Trong excel em dùng thì có thể xuống dòng ở trong 1 ô (Alt + Enter), kg phải kiểu Wraptext1653536002378.png
 
Lần chỉnh sửa cuối:
Upvote 0
Em vào MSWord á, chọn một đoạn văn bản, chọn canh đều (Justify). Sau đó đưa con trỏ vào giữa đoạn văn bản, rồi:
OP1: gõ Shift + Enter.
OP2: gõ Enter
thì sẽ hiểu tại sao họ đưa ra các thứ có vẻ trùng lặp lộn xộn như vậy.
Trong excel em dùng thì có thể xuống dòng ở trong 1 ô (Alt + Enter), kg phải kiểu WraptextView attachment 276470
Em vẫn chả hiểu gì :>
 
Upvote 0
m biết nói sao giờ nhỉ ! Kiểu em đang cố phân biệt giữa hai trường hợp
khi dùng các ký tự xuống dòng đó lúc muốn gán một đoạn văn bản xuống sheetkhi dùng các ký tự đó lúc đang ở trong một đoạn văn bản
Cái này tôi hiểu. Bạn đã từng gán xuống sheet: Sheet1.Range("A1").Value = "Ngay mai em di". Bây giờ bạn lăn tăn là khi muốn "em di" nó ở dòng mới thì giữa "Ngay mai" và "em di" phải thêm ký tự gì.

Còn cái này tôi không hiểu bạn định làm cái gì. Nên giải thích cụ thể mình định làm gì. Trên GPE không chỉ có những người thông minh hơn người mà còn những người không lanh lợi như tôi.
 
Upvote 0
Cái này tôi hiểu. Bạn đã từng gán xuống sheet: Sheet1.Range("A1").Value = "Ngay mai em di". Bây giờ bạn lăn tăn là khi muốn "em di" nó ở dòng mới thì giữa "Ngay mai" và "em di" phải thêm ký tự gì.

Còn cái này tôi không hiểu bạn định làm cái gì. Nên giải thích cụ thể mình định làm gì. Trên GPE không chỉ có những người thông minh hơn người mà còn những người không lanh lợi như tôi.
Dạ vâng ạ ! Em cứ nghĩ mọi người hiểu ý mình rồi chứ nên em cũng đang đợi câu trả lời khác từ mọi người ạ
khi dùng các ký tự đó lúc đang ở trong một đoạn văn bản
Do em không biết nói thế nào nên em xin giải thích lại các hành động và mục đích của em trong cái tệp đính kèm ở bài số #5 ạ
Giả sử mình có một chuỗi A như sau: "a" & vbLf & "b" & vbNewLine & "c" & vbCr & "d"
Trong bài số #4 anh Hesanbi nói 3 cái vbLr vbNewLine vbCr nó đều có mục đích xuống dòng nhưng mà lúc gán xuống sheet hay dùng trong một văn bản thì chúng khác nhau:
Ví dụ: "a" & vbLF & "b" & vbCrLF "c" & vbLF & "d", khi dán (Ctrl+V) vào ô Excel bạn sẽ được như sau:

a
b
c
d

Nhưng nếu bạn dán với dạng văn bản thuần tý vào ô thì vbCrLf sẽ từ động được chuyển thành vbLf, sẽ thành:

a
b
c
d

vbNewLine trong VBA thường dùng hơn vì nó cho phép tương thích nền tảng Window hay MACOS, nếu bạn viết ứng dụng 2 nền tảng cùng lúc.

Anh có nói đến sự khác nhau của nó nhưng mà theo em thấy có vẫn chưa rõ ràng mấy nên em có làm một đoạn code(đính kèm ở bài #5)
Lúc đó em muốn kiểm tra xem :
Lúc gán chuỗi A xuống sheet thì giá trị khi đã gán xuống nó như thế nào("3 cái đứa kia" có cái nào không hoạt động hay không) thì em nhận ra là cái vbCr nó không hoạt động khi gán xuống sheet.
Lúc sử dụng như trong một đoạn văn bản bình thường . Em nghĩ là hoạt động như một đoạn văn bản bình thường thì chắc cho "nó" vào cửa số immediate hoặc MsgBox để kiểm tra nhỉ . Nghĩ sao làm vậy ! Sau khi thiết lập xong em chạy thử thì "3 đứa kia" nó đều hoạt động . Nhưng do vẫn còn những chỗ chưa rõ ràng và vẫn không biết mình có làm đúng ý như anh Hesanbi chỉ hay không nên em mới hỏi lại ấy a
Hơn nữa em cũng muốn các anh đánh giá cái nhận xét của em ở bài #5 (xem nó đúng hay sai , có gì bổ xung hay không)
Nhận Xét:
Tất cả vbCr và vbLr và vbNewLine chỉ khác nhau lúc gán xuống cell trên excel (vbcr không có tác dụng) còn lúc gán vào văn bản thì không ( đều có tác dụng)
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ vâng ạ ! Em cứ nghĩ mọi người hiểu ý mình rồi chứ nên em cũng đang đợi câu trả lời khác từ mọi người ạ

Do em không biết nói thế nào nên em xin giải thích lại các hành động và mục đích của em trong cái tệp đính kèm ở bài số #5 ạ
Giả sử mình có một chuỗi A như sau: "a" & vbLf & "b" & vbNewLine & "c" & vbCr & "d"
Trong bài số #4 anh Hesanbi nói 3 cái vbLr vbNewLine vbCr nó đều có mục đích xuống dòng nhưng mà lúc gán xuống sheet hay dùng trong một văn bản thì chúng khác nhau:


Anh có nói đến sự khác nhau của nó nhưng mà theo em thấy có vẫn chưa rõ ràng mấy nên em có làm một đoạn code(đính kèm ở bài #5)
Lúc đó em muốn kiểm tra xem :
Lúc gán chuỗi A xuống sheet thì giá trị khi đã gán xuống nó như thế nào("3 cái đứa kia" có cái nào không hoạt động hay không) thì em nhận ra là cái vbCr nó không hoạt động khi gán xuống sheet.
Lúc sử dụng như trong một đoạn văn bản bình thường . Em nghĩ là hoạt động như một đoạn văn bản bình thường thì chắc cho "nó" vào cửa số immediate hoặc MsgBox để kiểm tra nhỉ . Nghĩ sao làm vậy ! Sau khi thiết lập xong em chạy thử thì "3 đứa kia" nó đều hoạt động . Nhưng do vẫn còn những chỗ chưa rõ ràng và vẫn không biết mình có làm đúng ý như anh Hesanbi chỉ hay không nên em mới hỏi lại ấy a
Hơn nữa em cũng muốn các anh đánh giá cái nhận xét của em ở bài #5 (xem nó đúng hay sai , có gì bổ xung hay không)
Bạn giải thích tôi vẫn không hiểu. Thôi thì thế này. Bạn chỉ cần nhớ là lúc nào thì xử lý thế nào.
1. gán xuống sheet. Bạn dùng vbLf là được. Không nhớ thêm các trường hợp hợp khác cho đầu nó nhẹ. Mục đích của bạn chỉ là làm xong công việc. vbLf giải quyết xong thì muôn đời cứ dùng vbLf là được.
2. xuống dòng trong MsgBox. Cứ dùng vbCrLf là chắc chắn được, như thế là xong việc. Không cần nhớ những cái khác làm gì. Muôn đời cứ vbCrLf là xong việc, vậy nhớ những cái khác để làm gì?
3. Nếu có những trường hợp khác mà bạn muốn thì liệt kê ra như tôi liệt kê ở trên. Còn cái gọi là "gán vào văn bản" tôi không hiểu đâu. Thế nào là "gán vào văn bản"?
 
Upvote 0
@Thớt:

Bạn cần mở rộng tầm nhìn ra, đừng chỉ tập trung vào Excel làm gì.
Khi nào va chạm với nhiều hệ điều hành (mac, linux, windows, chromeOS...) , nhiều nguồn văn bản (html, pdf, .docx...), văn bản được tạo/ nhập từ nhiều cách (gõ bàn phím, code...) thì lúc đó bạn quay lại bài này sẽ hiểu.

Tôi chỉ gợi ý vậy thôi.
 
Upvote 0
Bạn giải thích tôi vẫn không hiểu. Thôi thì thế này. Bạn chỉ cần nhớ là lúc nào thì xử lý thế nào.
1. gán xuống sheet. Bạn dùng vbLf là được. Không nhớ thêm các trường hợp hợp khác cho đầu nó nhẹ. Mục đích của bạn chỉ là làm xong công việc. vbLf giải quyết xong thì muôn đời cứ dùng vbLf là được.
2. xuống dòng trong MsgBox. Cứ dùng vbCrLf là chắc chắn được, như thế là xong việc. Không cần nhớ những cái khác làm gì. Muôn đời cứ vbCrLf là xong việc, vậy nhớ những cái khác để làm gì?
3. Nếu có những trường hợp khác mà bạn muốn thì liệt kê ra như tôi liệt kê ở trên. Còn cái gọi là "gán vào văn bản" tôi không hiểu đâu. Thế nào là "gán vào văn bản"?
Dạ vâng ạ ! Đúng là em kiểu hơi tò mò thật ^^ . Lúc nào có trường hợp đặc biệt nào đó thì em lại lôi bài này lên vậy :>
Bài đã được tự động gộp:

@Thớt:

Bạn cần mở rộng tầm nhìn ra, đừng chỉ tập trung vào Excel làm gì.
Khi nào va chạm với nhiều hệ điều hành (mac, linux, windows, chromeOS...) , nhiều nguồn văn bản (html, pdf, .docx...), văn bản được tạo/ nhập từ nhiều cách (gõ bàn phím, code...) thì lúc đó bạn quay lại bài này sẽ hiểu.

Tôi chỉ gợi ý vậy thôi.
Ui anh đừng làm em rối thêm thế chứ :> Kiểu giờ cái gì cũng phải học thành ra hơi bị ngợp ấy anh .
Không hồi kết ! (Cuộc chiến trong tâm trí)
 
Upvote 0
Dạ vâng ạ ! Đúng là em kiểu hơi tò mò thật ^^ . Lúc nào có trường hợp đặc biệt nào đó thì em lại lôi bài này lên vậy :>
Bài đã được tự động gộp:


Ui anh đừng làm em rối thêm thế chứ :> Kiểu giờ cái gì cũng phải học thành ra hơi bị ngợp ấy anh .
Không hồi kết ! (Cuộc chiến trong tâm trí)
"Học ngày không đủ, tranh thủ học đêm đi bạn" hehehe --=0--=0--=0
 
Upvote 0
Dạ vâng ạ ! Đúng là em kiểu hơi tò mò thật ^^ .
Bạn có nhiều thời gian à?

Nếu tò mò thì thế này. Nếu trong notepad bạn nhấn Enter thì notepad sẽ chèn 2 bai 13 và 10. Nếu bạn có nhiều tập tin TXT từ nhiều nguồn thì rất có thể bạn sẽ bắt gặp chỉ có bai 10 không có bai 13 đi kèm. Tôi chưa gặp tập tin TXT với bai 13 đơn độc. Nhưng tôi không phán gì cả vì tôi có thể nhìn thấy ít, gặp ít, biết ít. Tuy nhiên bạn có thể gõ Ngay maiem di (không có dấu cách giữa "mai" và "em") trong notepad -> lưu lại ở dạng vd. ANSI. Sau đó mở bằng Hex Editor -> click giữa "Ngay mai" và "em di" (click trước "e") -> menu Edit -> Insert bytes -> trong trường Bytecount nhập 1, chọn hex, trong trường Hex-values nhập 0D -> OK -> OK -> menu File -> Save.

Bây giờ mở lại sẽ thấy notepad hiển thị 2 dòng. Tôi chỉ nói về notepad vì các phần mềm khác nhau có thể hiển thị khác nhau. Ta chỉ xét notepad của Windows.

Nếu bạn làm như trên với nội dung ban đầu là Ngày maiem đi thì không ghi được ở dạng ANSI vì có chứa ký tự unicode, hãy chọn UTF-16 LE. Trong Hex Editor bạn phải nhập Bytecount = 2 (chèn 2 bai), chọn hex, trong trường Hex-values nhập 0D 00 (2 bai)

Tương tự soạn tập tin ANSI như trên nhưng chèn 0A (bai 10), và tập tin thứ ba với 2 bai là 13 và 10 (ANSI) bằng cách nhấn Enter sau từ "mai" trong notepad.

Tạo 3 tập tin có vbCr, vbLf và vbCrLf để làm gì? Để vọc, để học vì bạn đang thừa thời gian mà.

Trong tương lai có thể bạn sẽ phải dùng FileSystemObject (tìm trên GPE) để đọc dữ liệu từ tập tin TXT, và nhu cầu cần đọc TỪNG DÒNG. Vậy hãy viết code dùng FileSystemObject (tìm trên GPE) và có đọc từng đòng. Bạn sẽ mục sở thị xem FileSystemObject có đọc đúng từng dòng khi phân cách chỉ là vbCr hoặc vbLf hay không. Mục sở thị rồi thì biết. Đó là bài học thực tế hữu ích. Thay vì cứ ngồi rồi "học thuộc lòng lý thuyết".
 
Upvote 0
Web KT

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

Back
Top Bottom