คำถามนี้ค่อนข้างเก่า แต่จนถึงวันนี้ดูเหมือนจะไม่มีคำตอบ ฉันเคยเห็นคำถามที่คล้ายกันในเว็บไซต์จำนวนหนึ่ง แต่ยังไม่พบคำตอบใด ๆ ที่เกี่ยวข้องกับฟังก์ชัน Excel ในตัวเท่านั้น อย่างไรก็ตามมันค่อนข้างง่ายที่จะแก้ปัญหานี้ด้วย VBA คุณไม่ต้องรู้วิธีตั้งโปรแกรมให้ทำเช่นนี้เพราะฟังก์ชั่นที่ต้องการนั้นง่ายมาก
เปิดเวิร์กบุคของคุณเพียงกดAlt + F11 (เพื่อเปิดตัวแก้ไข VBA) จากนั้นคลิกที่รายการเมนูแทรก > โมดูล
ในโมดูล VBA ใหม่ให้ป้อนข้อมูลต่อไปนี้:
Public Function FMT$(ByVal Value, ByVal strFormat)
FMT = VBA.Format$(Value, strFormat)
End Function
สิ่งนี้จะเป็นเพียงการใช้ตัวเอง VBA ของFormat
ฟังก์ชั่นแทน Excel ของTEXT
ฟังก์ชั่น นี่คือสิ่งที่คุณต้องการ
ฟังก์ชันใหม่นี้จะจัดรูปแบบวันที่ใด ๆ (หรือตัวเลข) ตามสตริงรูปแบบที่คุณระบุ มันจะตีความสตริงรูปแบบโดยใช้สัญลักษณ์มาตรฐาน ( en-US ) โดยไม่คำนึงถึงการตั้งค่าภูมิภาคของระบบปฏิบัติการ
ที่จะใช้ในสมุดงานของคุณเพียงแค่พิมพ์แทน=FMT(A1, "yyyymmdd_hhss")
=TEXT(A1, "yyyymmdd_hhss")
(แน่นอนคุณสามารถเปลี่ยนการอ้างอิงเซลล์และสตริงรูปแบบได้ตามต้องการ)
โดยวิธีการที่คุณสามารถตั้งชื่อฟังก์ชั่นสิ่งที่คุณต้องการ ฉันเลือกFMT
เพราะมันสั้นและเพราะฟังก์ชั่นสามารถจัดรูปแบบทั้งตัวเลขและวันที่ แต่คุณสามารถเลือกสิ่งที่อธิบายเพิ่มเติมถ้าคุณต้องการ เพียงจำไว้ว่าให้ใช้ชื่อเดียวกันในแผ่นงานของคุณเช่นเดียวกับในรหัส VBA
โปรดทราบว่าสตริงรูปแบบ VBA นั้นไม่เหมือนกับสตริงรูปแบบที่กำหนดเองของ Excel (ตัวอย่างเช่นใช้ "n" แทน "m" เป็นเวลาหลายนาที) แต่มีความคล้ายคลึงกันมาก ดูที่นี่สำหรับรายละเอียดหรือค้นหา MSDN สำหรับ "ฟังก์ชั่นการจัดรูปแบบ (Visual Basic สำหรับแอปพลิเคชัน)" เลื่อนไปที่ด้านล่างเพื่อดูตัวระบุรูปแบบวันที่ต่างๆ
วิธีที่ 2
อีกวิธีหนึ่งที่ใช้ VBA แต่จริง ๆ แล้วอาจจะง่ายต่อการบำรุงรักษาคือ:
- ใช้รูปแบบวันที่ที่คุณต้องการกับเซลล์โดยใช้กล่องโต้ตอบจัดรูปแบบเซลล์ปกติ เซลล์นี้สามารถอยู่ในชีตที่ซ่อนอยู่ได้หากต้องการ - ไม่จำเป็นต้องแสดงให้ผู้ใช้เห็น สมมติว่าคุณใช้รูปแบบ
yyyymmdd\_hhss
กับเซลล์$ A $ 1 (โปรดทราบว่าเครื่องหมายขีดล่างจะต้องหลีกหนีตามที่แสดง)
- เพิ่ม
GetFormat
ฟังก์ชั่น (แสดงด้านล่าง) ไปยังโมดูล VBA ในสมุดงานของคุณ
- ใส่
=GetFormat($A$1, TRUE)
เข้าไปในเซลล์อื่น (เช่น$ B $ 1 )
- ฟังก์ชันนั้นจะส่งคืนรูปแบบสตริงที่แปลเป็นภาษาท้องถิ่น ดังนั้นแม้ว่าคุณจะเริ่มต้นจัดรูปแบบ$ A $ 1ด้วย
yyyymmdd\_hhss
เมื่อคุณเปิดเวิร์กบุ๊กบนคอมพิวเตอร์โดยใช้ภาษาฝรั่งเศส (ตัวอย่าง) ฟังก์ชันจะแสดงaaaammjj\_hhss
ขึ้น
- ตอนนี้เพียงแค่อ้างอิงเซลล์ที่สองในทุก
TEXT
ฟังก์ชั่นของคุณ ตัวอย่างเช่น=TEXT(F22, $B$1)
.
นี่คือรหัส VBA:
Public Function GetFormat$(Cell As Range, Optional ByVal UseLocal As Boolean)
If UseLocal Then
GetFormat = Cell.NumberFormatLocal
Else
GetFormat = Cell.NumberFormat
End If
End Function
สิ่งนี้ช่วยให้เราสามารถ "ตรวจสอบ" เซลล์ที่คุณจัดรูปแบบมา แต่เดิม ($ A $ 1) เพื่อดึงรูปแบบสตริงที่แปลเป็นภาษาท้องถิ่น สตริงนั้นจะแสดงรูปแบบเดียวกับที่คุณใช้ แต่จะใช้ตัวอักษรที่ถูกต้องสำหรับ TEXT เพื่อตีความ (ตัวอย่างเช่น "j" แทนที่จะเป็น "d") ดังนั้นค่าที่แสดงของวันที่จะคงที่ในทุกโลแคล หากคุณต้องการใช้รูปแบบวันที่เพียงรูปแบบเดียวสำหรับทั้งสมุดงานของคุณคุณจะต้องทำตามขั้นตอนที่ 1-4 ครั้งเดียว จากนั้นทำซ้ำขั้นตอนที่ 5 (ฟังก์ชั่น TEXT) ในทุกเซลล์ที่คุณใช้งานอยู่ในปัจจุบัน แต่แทนที่จะจัดรูปแบบฮาร์ดโค้ดคุณเพียงแค่อ้างอิงเซลล์ที่มีรูปแบบสตริง ( $ B $ 1ในคำแนะนำตัวอย่าง) .
โปรดทราบว่าอาร์กิวเมนต์ที่สองเพื่อGetFormat
บอกฟังก์ชันว่าจะส่งคืนเวอร์ชันที่แปลแล้วหรือไม่ (ขึ้นอยู่กับการตั้งค่าภูมิภาค) หรือเวอร์ชัน "มาตรฐาน" (ซึ่งอิงจาก en-US เสมอ)
ต่อไปนี้เป็นภาพหน้าจอที่อาจทำให้ภาพชัดเจนยิ่งขึ้น
- ในรูปคอลัมน์ 1 แสดงการแทนหลายวันเดียวโดยใช้รูปแบบที่แตกต่างกัน
- โปรดทราบว่าแถวที่ 2 และ 3 ใช้รูปแบบวันที่ "เริ่มต้นระบบ" ของ Excel (สิ่งเหล่านี้ถูกระบุโดยเครื่องหมายดอกจันชั้นนำในรูปแบบกล่องโต้ตอบและพวกเขาระบุว่าควรใช้รูปแบบวันที่เริ่มต้นของผู้ใช้) นอกจากนี้โปรดทราบว่าแถว 5 ใช้ LCID ในวงเล็บซึ่งบังคับให้ภาษาที่ใช้สำหรับชื่อเดือนและวันเป็นภาษาอังกฤษ LCID ที่แตกต่างกันสามารถใช้เพื่อระบุภาษาอื่น ๆ )
- คอลัมน์ที่สองแสดงผลลัพธ์ของ
GetFormat(Cell, FALSE)
สำหรับแต่ละเซลล์ในคอลัมน์ 1 (จำได้ว่าFALSE
สำหรับพารามิเตอร์ที่สองทำให้ฟังก์ชั่นกลับไม่ใช่ภาษาท้องถิ่นรูปแบบที่ )
- คอลัมน์ที่สามแสดงสิ่งที่
GetFormat(Cell, TRUE)
ส่งกลับสำหรับแต่ละเซลล์ในคอลัมน์ 2 (เช่นรูปแบบที่แปลแล้ว )
- คอลัมน์ที่สี่แสดงผลลัพธ์ของฟังก์ชัน TEXT โดยใช้ค่าวันที่แบบดิบดั้งเดิมและผลลัพธ์ที่แปลเป็นภาษาท้องถิ่นของ
GetFormat
การสร้างรูปแบบที่แสดงในคอลัมน์ 1 อีกครั้งอย่างไรก็ตามโปรดทราบว่าการจัดรูปแบบตัวเลขไม่ถูกนำไปใช้กับคอลัมน์นี้ ค่าเป็นผลลัพธ์โดยตรงของฟังก์ชัน TEXT
ผลลัพธ์สำหรับกรณีภาษาอังกฤษ (สหรัฐอเมริกา) ด้านบนไม่น่าสนใจมาก แต่คุณสามารถเปรียบเทียบกับผลลัพธ์ต่อไปนี้ที่ได้รับจากการเปลี่ยนการตั้งค่าภูมิภาคของระบบปฏิบัติการของฉันไปยังตำแหน่งที่ตั้งอื่น ๆ ที่สำคัญโปรดทราบว่าโดยใช้GetFormat
ร่วมกับTEXT
เราจะสามารถเก็บผลลัพธ์ที่คงที่สำหรับรูปแบบตัวเลข (ที่ไม่รวมชื่อวันหรือเดือน) ในทุกโลแคล และโดยการ จำกัด ภาษาโดยใช้ LCID (เช่นเดียวกับในแถวที่ 5) เรายังสามารถรักษารูปแบบคงที่ได้เมื่อรวมชื่อวันและเดือนด้วย
วิธีนี้ใช้ได้กับหลายภาษาอย่างไรก็ตามควรสังเกตว่าสคริปต์ที่ใช้แสดงตัวเลขฮินดู - อารบิกนั้นไม่เหมือนกันในทุกภาษา ดังนั้นการตั้งค่าภูมิภาคเช่นที่ตั้งของเนปาล (อินเดีย) จะส่งผลให้รูปแบบวันที่ "ดู" แตกต่างจากวันที่ในสหรัฐอเมริกา แต่ที่จริงแล้วมันอยู่ในรูปแบบ "เดียวกัน" ในแง่ของตำแหน่งของตัวเลข - พวกเขาเพียงแค่ใช้สัญลักษณ์ที่แตกต่างกันสำหรับตัวเลข