สาเหตุสามารถอนุมานได้จากความแตกต่างระหว่าง
NUL : ไม่มีอักขระ ใช้สำหรับเติมเวลาหรือเติมพื้นที่บนพื้นผิว (เช่น พื้นผิวของจาน) ของอุปกรณ์จัดเก็บข้อมูลที่ไม่มีข้อมูล เราจะใช้อักขระนี้เมื่อเราจะทำการเขียนโปรแกรมสำหรับที่ปัดน้ำฝนข้อมูล (ทั้งแบบทำลายล้างและไม่ทำลาย) เพื่อล้างพื้นที่ที่ไม่ได้ถูกจัดสรร เพื่อให้ข้อมูลที่ถูกลบไม่สามารถกู้คืนได้โดยโปรแกรมใดโปรแกรมหนึ่งหรือโปรแกรมใด ๆ
SOH : อักขระนี้ใช้เพื่อระบุจุดเริ่มต้นของส่วนหัว ซึ่งอาจมีที่อยู่หรือข้อมูลเส้นทาง
STX : อักขระนี้ใช้เพื่อระบุจุดเริ่มต้นของข้อความ และในลักษณะนี้ยังใช้เพื่อระบุจุดสิ้นสุดของส่วนหัวด้วย
แหล่งที่มาของคำจำกัดความ
ความคิดเห็นต่างๆ ได้ชี้ให้เห็นแล้วว่าอักขระเหล่านี้ (32 ตัวแรก) เรียกว่าอักขระควบคุม เนื่องจากอักขระเหล่านี้ทำหน้าที่ควบคุมเครื่องพิมพ์และการแสดงผลต่างๆ แทนที่จะแสดงสัญลักษณ์
ใน Hadoop นั้น SOH มักใช้เป็นตัวคั่นฟิลด์โดยเฉพาะในขณะที่อ่านไฟล์ CSV นอกจากนี้ เมื่อเปิดไฟล์ Excel (โดยไม่ต้องแตกไฟล์เป็น xlsx ธรรมดา เช่น ไบนารี่) ใน Notepad++ และพิมพ์อักขระควบคุม เราจะเห็นอักขระ SOH จำนวนมาก เนื่องจากคุณสมบัติด้านความปลอดภัย จึงไม่สามารถมองเห็นข้อมูลจริงได้
chr(0) = SOH เป็นตัวชี้ไปยังที่อยู่หน่วยความจำของเซลล์ทั้งหมดที่มี TEXT
และ
chr(1) = NUL เป็นตัวชี้ไปยังที่อยู่หน่วยความจำของเซลล์ทั้งหมดที่มี NULL หรือ BLANK CELLS
ลองดูข้อความข้างต้นตามคำสั่งต่างๆ ที่แสดงในภาพด้านล่าง ซ้ายบนคือช่วงข้อมูลดั้งเดิม และตัวอย่างแสดงให้เห็นว่าการแทนที่ทำงานอย่างไรสำหรับ SOH, NUL และ ASTERISK (*) โดยใช้ฟังก์ชัน Range.Replace
![SOH แทนที่ทั้งหมดใน EXCEL](https://i.stack.imgur.com/XXux0.png)
ดังนั้นเหตุใด Chr(0) และ Chr(1) จึงสามารถแทนที่ค่าในเซลล์ Excel ได้หากเป็นเพียงตัวชี้ที่อยู่และ chr(1) ทำหน้าที่แตกต่างจาก chr(42) อย่างไร
สิ่งนี้เกิดขึ้นเนื่องจากโครงสร้างของแผ่นงาน Excel เมื่อคุณเปิดสมุดงาน Excel ใหม่ เซลล์ Excel จะไม่ถูกทำเครื่องหมาย มันเป็นภาพที่สมบูรณ์และอยู่ในหน่วยความจำแบบแข็งและแบบอ่อนของระบบ
อย่างไรก็ตาม ทันทีที่มีเซลล์ใดเข้าสู่เซลล์ B2 เซลล์ว่างทั้งหมดที่ยกกำลังสองไปจนถึง B2 จะถูกกำหนดตัวชี้ด้วย Chr(0) และเซลล์ B2 จะถูกกำหนดตัวชี้ด้วย Chr(1)
ตอนนี้ ถ้าใครลบเนื้อหาของเซลล์ B2 เซลล์ B2 จะถูกกำหนดตัวชี้ NUL หรือ Chr(0) ให้กับเซลล์นั้นพร้อมกับเซลล์อื่นๆ
นี่เป็นเหตุผลว่าทำไมการล้างเนื้อหาโดยใช้ Cells.ClearContents เท่านั้นจะไม่ล้างเซลล์ในหน่วยความจำ และเวิร์กบุ๊ก Excel จะขยายใหญ่ขึ้นเมื่อมีการใช้เซลล์ที่อยู่ห่างไกลแต่ไม่ถูกลบโดยใช้ Cells.Clear หรือ Ctrl+Delete
ขณะนี้เป็นที่ชัดเจนว่าเหตุใด Excel จึงแทนที่เนื้อหาหรือล้างแผ่นงานด้วยคำสั่งที่กำหนด สิ่งสำคัญคือต้องเข้าใจความแตกต่างระหว่างเครื่องหมายดอกจัน (*) และ SOH [หรือ Chr(0)]
เครื่องหมายดอกจัน (*) แทนที่เนื้อหาของเซลล์ที่มีความยาวขั้นต่ำ 0
ในขณะที่ Chr(0) ระบุเซลล์ด้วย SOH เช่นเซลล์ที่มีค่าแล้วแทนที่ค่าที่ปลายทางของตัวชี้
ความแตกต่างไม่ได้อยู่ที่ผลลัพธ์ แต่อยู่ที่วิธีการค้นหาหรือระบุเซลล์ที่จะแทนที่
ฉันสร้างมาโครขนาดเล็กเพื่อตรวจสอบสมมติฐานที่ฉันบันทึกเวลาที่ใช้ในการแทนที่ครึ่งล้านเซลล์ (A1 ถึง CZ5000) โดยใช้ Chr(1) = SOH และ Chr(42) = *
ปรากฎว่าการใช้ตัวชี้ไปยังที่อยู่ของเซลล์ที่มีข้อความ เช่น SOH ใช้เวลาน้อยกว่าเครื่องหมายดอกจัน (*)
![เวลาที่ใช้ในการแทนที่ข้อความ](https://i.stack.imgur.com/7hKdx.png)
Sub Replace_Timer()
Sheet3.Activate
Dim startTime, endTime
Dim i As Integer
Sheet3.Range("A1:CZ5000").Value = "A"
For i = 1 To 25
startTime = Timer
Sheet3.Cells.Replace Chr(1), "X", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 2).Value = endTime - startTime 'Execution time in miliseconds
startTime = Timer
Sheet3.Cells.Replace Chr(42), "Z", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 3).Value = endTime - startTime 'Execution time in miliseconds
Next
Sheet4.Activate
End Sub
person
jainashish
schedule
21.02.2019
[A1].value = "-" & Chr(1) & "-"
ดูแปลกๆ ดี :D - person Dirk Reichel   schedule 10.08.2017Chr(1)
หมายถึงStart of Heading
และนี่คือเอกสาร (cs.tut.fi/~ jkorpela/chars/c0.html) อธิบายอักขระควบคุม ASCII ทั้งหมด เว็บไซต์ของรัฐบาลอื่น (its.bldrdoc.gov/fs-1037/ dir-034/_5089.htm) มีคำอธิบายที่ดีกว่าและยังน่าสับสนสำหรับChr(1)
- person ian0411   schedule 25.08.2017chr(1)
คืออะไร ฉันแค่สับสนว่าทำไม Excel ทำหน้าที่เหมือนกับที่จะทำกับเครื่องหมายดอกจัน (ตัวยึดตำแหน่ง) แต่ไม่ใช่สำหรับอักขระอื่น ๆ ที่ไม่สามารถพิมพ์ได้ ดูเหมือนว่ามีบางสิ่งที่อยู่ลึกเข้าไปในแอปพลิเคชันนั้นเองที่ทำให้ Excel สับสน ฉันใจดีถ้าอยากรู้ว่าเกิดอะไรขึ้นที่นั่น (แต่ผมมั่นใจว่าผมไม่สามารถเข้าใจได้จริงนะครับ) :P - person Dirk Reichel   schedule 25.08.2017Chr(1)
เป็นตัวยึดตำแหน่งที่แท้จริง (ไม่เช่นนั้นจะไม่สามารถค้นหา *) ได้ แต่การไม่มีทางทำเช่นนั้นได้ (เท่าที่ฉันรู้) มันอาจจะเหลืออยู่บ้าง ถึงกระนั้นหากไม่มีโปรแกรมเมอร์มาหยุดที่นี่โดยบังเอิญ ฉันสงสัยว่าฉันจะได้รับคำตอบที่ถูกต้องหรือไม่ :/ - person Dirk Reichel   schedule 13.09.2017Chr(63)
ซึ่งก็คือ?
ทำสิ่งเดียวกัน - person Karthick Gunasekaran   schedule 22.09.2017?
เป็นตัวยึดตำแหน่งสำหรับอักขระตัวเดียวในขณะที่*
เป็นตัวยึดตำแหน่งสำหรับอักขระจำนวนเท่าใดก็ได้... - person Dirk Reichel   schedule 22.09.2017xlPart
ดังนั้นเหตุการณ์ทั้งหมดจะถูกแทนที่ (หากแทนที่ a ด้วย c ดังนั้น aba จะกลายเป็น cbc) วิธีนี้จะทำให้สตริงทั้งหมดถูกล้าง char โดย char) ;) - person Dirk Reichel   schedule 23.09.2017chr(1)
ที่นี่ และ ที่นี่. - person ashleedawg   schedule 18.10.2017SendKeys Chr(1)
ทำงานเหมือน CTRL+A,Chr(2)
ทำงานเหมือน CTRL+B ฯลฯ (รายละเอียดเพิ่มเติมที่นี่ dc .org/files/asciitable.pdf) อาจเป็นไปได้ว่า vba แปล chr(1) เป็น 'เลือกทั้งหมด' ดังนั้นเซลล์ที่ไม่ว่างทั้งหมดจึงถูกแทนที่ - person TomJohnRiddle   schedule 22.01.2018ActiveSheet.Cells.Find(Chr(1), ActiveCell).Activate
จะทำงานเหมือนกับเป็นไปตามเงื่อนไขเสมอ แต่วิธีการเปรียบเทียบอื่นๆ จะไม่แสดงพฤติกรรมดังกล่าว เช่นinstr()
และเช่นเดียวกับคำใบ้: สิ่งนี้จะใช้ได้หากคุณเปิดหน้าต่างแทนที่และวางนิพจน์Chr(1)
ลงในช่องค้นหา และในทางกลับกันสำหรับการเลือกทั้งหมด: Microsoft Word จะไม่แสดงพฤติกรรมนี้เลย - person Dirk Reichel   schedule 15.08.2018