มากกว่า

กำหนดเส้นทางการติดฉลากเป็นสถานี (0+00) ด้วย vba

กำหนดเส้นทางการติดฉลากเป็นสถานี (0+00) ด้วย vba


ฉันมีคุณสมบัติเส้นทางที่ฉันได้ตั้งค่าให้ติดป้ายกำกับทุกๆ 500' ด้วยระยะทางตลอดเส้นทาง ฉันต้องการใช้รูปแบบการหยุดนิ่งทั่วไป (000+00) ฉันใช้สคริปต์ VBA ต่อไปนี้:

ฟังก์ชัน FindLabel ( esri__measure ) ถ้า esri_measure=0 แล้ว FindLabel = "0+00" elseif esri_measure<1000 แล้ว varleft = left(esri__measure, 1) varright = right(esri__measure, 2) FindLabel = varleft & "+" & varright else varleft = left(esri__measure, 2) varright = right(esri__measure, 2) FindLabel = varleft & "+" & varright end if End Function

"else" แต่ละตัวทำงานอย่างถูกต้องด้วยตัวมันเอง แต่เมื่อป้อนสคริปต์ทั้งหมดแล้ว "else" ตัวแรกที่ตอบสนองจะถูกนำไปใช้กับป้ายกำกับทั้งหมด ตัวอย่างเช่น ด้วยสคริปต์ตามที่คัดลอกด้านบน ป้ายกำกับระยะทางทุกอันจะอ่านว่า "0+00" เพื่อดูว่าเกิดอะไรขึ้น ฉันลองเปลี่ยนสคริปต์เป็น:

ฟังก์ชัน FindLabel ( esri__measure ) ถ้า esri_measure<1000 แล้ว varleft = left(esri__measure, 1) varright = right(esri__measure, 2) FindLabel = varleft & "+" & varright else varleft = left (esri__measure, 2) varright = right(esri__measure, 2) FindLabel = varleft & "+" & varright end ถ้า End Function

ด้วยสคริปต์นี้ ทุกป้ายกำกับจะมีรูปแบบเป็น "X+00" เมื่อค่ามากกว่าหรือเท่ากับ 1,000 ฉันต้องการให้มันอ่าน "X0+00" ปัญหาดูเหมือนว่าโปรแกรมจะทดสอบเฉพาะป้ายกำกับแรก (ระยะทาง 0) กับคำสั่ง "if" จากนั้นจึงนำผลลัพธ์ไปใช้กับทุกตำแหน่งที่มีป้ายกำกับ ฉันจะให้แต่ละป้ายกำกับทำงานผ่านคำสั่ง "if" อย่างอิสระแทนที่จะทดสอบเฉพาะจุดแรกได้อย่างไร


คุณพลาดขีดล่างในตัวแปร esri__measure ใน 2 if clauses แรกของคุณ ดังนั้นพวกเขาจึงทดสอบเสมอว่าเท่ากับ 0 และเติมเต็มเงื่อนไขของประโยคแรก (ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น esri_measure จะเท่ากับ 0 ในขณะที่ esri__measure ไม่ใช่ 0) ดังนั้น ในความเป็นจริง ไม่มีการทดสอบการวัดใดๆ ในอนุประโยคของคุณ มีเพียงตัวแปรที่ไม่ดีที่เป็น 0 เสมอ

หากคุณคาดว่าการวัดของคุณจะเกิน 10,000 (เช่นเดียวกับที่ฉันทำ) นิพจน์ของคุณจำเป็นต้องมีส่วนคำสั่งเพิ่มเติม ของฉันอาจสูงถึง 150,000 โค้ดนี้จะทำงานกับค่าการวัดใดๆ ระหว่าง 0 ถึง 999,999 และด้วยช่วงเวลาที่หารด้วย 100 ไม่ได้

ฟังก์ชัน FindLabel ( esri__measure ) ถ้า CLng (esri__measure) < 10 แล้ว varleft = 0 varright = right(CLng(esri__measure), 1) FindLabel = varleft & "+0" & varright elseif CLng(esri__measure) < 100 แล้ว varleft = 0 varright = right(CLng(esri__measure), 2) FindLabel = varleft & "+" & varright elseif CLng(esri__measure) < 1000 แล้ว varleft = left(CLng(esri__measure), 1) varright = right(CLng(esri__measure), 2) FindLabel = varleft & "+" & varright elseif CLng(esri__measure) < 10000 จากนั้น varleft = left(CLng(esri__measure), 2) varright = right(CLng(esri__measure), 2) FindLabel = varleft & "+" & varright elseif CLng(esri__measure) ) < 100000 จากนั้น varleft = left(CLng(esri__measure), 3) varright = right(CLng(esri__measure), 2) FindLabel = varleft & "+" & varright else varleft = left(CLng(esri__measure), 4) varright = right (CLng(esri__measure), 2) FindLabel = varleft & "+" & varright end if End Function

ที่จริงแล้ว เนื่องจากคุณรู้ว่าการวัดทั้งหมดของคุณลงท้ายด้วย +00 เสมอ เพราะนั่นใช้กับทุกช่วงที่ 500 คุณจึงสามารถลดความซับซ้อนของนิพจน์เป็น:

esri__measure / 100 & "+00"

คุณต้องการนิพจน์ที่ซับซ้อนมากขึ้นเท่านั้นในโพสต์ก่อนหน้าของฉันเมื่อช่วงฟักไข่ของคุณหารด้วย 100 ไม่ใช่ค่าจำนวนเต็ม

ที่จะนำไปใช้หากการวัดล่าสุดแสดงให้เห็นว่าลดลงในช่วงเวลาหรือไม่ อย่างไรก็ตาม ในกรณีนั้น คุณจะต้องตรวจสอบให้แน่ใจว่าค่าทั้งหมดถูกปัดเศษเป็นจำนวนเต็มก่อนที่จะแยกตัวเลขสองหลักที่ถูกต้องออกจากตัวเลข ดังนั้นฉันจึงแก้ไขนิพจน์ก่อนหน้าเพื่อจัดการกับสิ่งนั้น


ดูวิดีโอ: The 7 Keys Areas of Excel VBA with code examples