กำลังมองหาวิธีการที่จะทำให้สูตร IF สั้นลง


9

ฉันมีสูตรยาวที่มีโครงสร้างต่อไปนี้:

=IF(!X!<>0,!X!+A1,"")

อยู่ที่ไหน! X! เป็นสูตรที่ยาวมาก

มีวิธีแก้ไขปัญหาใดเพื่อหลีกเลี่ยงการทำซ้ำ!! ครั้งที่สอง? ฉันต้องการมันด้วยเหตุผลสองประการ:

  1. เพื่อให้สูตรอ่านได้สำหรับผู้ใช้ชีต
  2. เพื่อลดเวลาในกระบวนการ

ฉันขอขอบคุณความช่วยเหลือใด ๆ

ขอบคุณ Dio


1
ถ้าคุณต้องการTo reduce the process timeเห็นได้ชัดว่าคุณต้องเก็บผลลัพธ์ไว้ที่อื่นมิฉะนั้น Excel จะต้องคำนวณค่าใหม่อีกครั้งเมื่อเงื่อนไขตรงกัน แผนกยังเป็นการดำเนินการที่มีค่าใช้จ่ายสูงมาก
phuclv

2
เพียงแค่อยากรู้อยากเห็นเช่นกันคุณ "กอล์ฟ" สูตรยาวลงมากที่สุดเท่าที่จะทำได้? หากต้องการทำให้สั้นลงอาจเพิ่มช่วงที่มีชื่อ
BruceWayne

เพื่อให้สูตรยาวอ่านง่ายขึ้นให้แยกอาร์กิวเมนต์ไปยังบรรทัดอื่นโดยใช้ alt + return ข้อเสียเดียวคือถ้าผู้ใช้ไม่ขยายความสูงของแถบสูตรสูตรจะดูไม่สมบูรณ์
แบรดสมิ ธ

คำตอบ:


12

อีกวิธีคือการใช้การผกผันสองครั้ง :

=IFERROR(1/(1/really_long_formula)+A1,"")

หากreally_long_formulaประเมินเป็น0คุณจะได้หารด้วยศูนย์และIFERROR()จะจับมัน!

โปรดทราบว่าวิธีปกติ(และวิธีที่ดีที่สุด)ในการจัดการข้อกำหนดนี้คือเซลล์ผู้ช่วย


7
สิ่งนี้อาจได้รับผลกระทบจากการสูญเสียความแม่นยำเนื่องจากการแบ่งจุดลอยตัว
phuclv

3
@ LưuVĩnhPhúc คุณถูกต้องครบถ้วน! AFHวิธีคือวิธีที่ดีที่สุด!
แกรี่ของนักเรียน

นี่เป็นกลอุบายที่ดีและสกปรก ฉันจะงดใช้มันอย่างหนัก แต่เป็นหนทางสุดท้ายใครจะรู้ล่ะ
André Chalella

3
หมายเหตุ:มันเป็นความจริงที่อาจมีการสูญเสียความแม่นยำบางอย่าง แต่มันไม่ค่อยจะเป็นปัญหาที่เกี่ยวข้อง ฉันทดสอบ1/1/xด้วยตัวเลขสุ่ม 100,000 ครั้งใน Excel และเพียง 1.4% ของเวลาที่มีข้อผิดพลาดในการปัดเศษ ข้อผิดพลาดสัมพัทธ์สูงสุดที่ฉันเคยพบคือ 1.6e-16 ซึ่งก็คือศูนย์อย่างมีประสิทธิภาพ ที่น่าสนใจคือจำนวนเต็มไม่เคยแสดงข้อผิดพลาดในการปัดเศษ (ทดสอบหลายช่วงตั้งแต่ 0 ถึง 1e14) ดังนั้นคำตอบนี้อาจขมวดคิ้วจากจุดยืนความบริสุทธิ์ / ความสะอาด แต่ไม่ได้มาจากมุมมองการคำนวณในทางปฏิบัติ
André Chalella

1
ฉันพบทางออกของ Gary ที่ดีที่สุด ครั้งแรกเพราะมันสะอาด (ดังกล่าวโดยAndré) และสามารถอ่านได้โดยผู้ใช้รายอื่น ประการที่สองเพราะมันตอบสนองความต้องการของฉัน ฉันไม่มีจำนวนเต็มซับซ้อนหรือยาว ฉันหวังว่าผู้ใช้ที่เลือกวิธีการนี้อ่านความคิดเห็นเพื่อทราบถึงข้อดีและข้อเสียของโซลูชันนี้
Dio

23

คำตอบที่ชัดเจนคือการใส่สูตรไว้ในเซลล์งานห่างจากแผ่นงานหลัก ตัวอย่างเช่นหากคุณใช้H1ให้ตั้งเป็น:

=!X!

สูตรของคุณจะกลายเป็น:

=IF(H1<>0,H1+A1,"")

นี่เป็นเรื่องปกติของสิ่งที่จะทำในภาษาการเขียนโปรแกรมอื่น


ฉันไม่มีความเป็นไปได้ที่จะเพิ่มคอลัมน์ความช่วยเหลือ ขอบคุณอยู่ดี
Dio

2
@Dio หากไม่ควรเห็นแล้วให้ซ่อนคอลัมน์ คุณยังสามารถตั้งชื่อคอลัมน์ / ช่วงที่จะทำให้มันง่ายต่อการอ่าน
phuclv

4
@Dio - ตกลง คำตอบที่คุณยอมรับนั้นค่อนข้างฉลาด แต่โปรดทราบว่าเนื่องจากการปัดเศษคุณอาจสูญเสียความถูกต้อง ( 1/(1/x)อาจไม่เหมือนกันเสมอไปx) โดยเฉพาะอย่างยิ่งหากคุณจัดการกับข้อมูลจำนวนเต็ม นอกจากนี้ยังไม่สามารถใช้ได้โดยทั่วไป (เช่นการตรวจสอบน้อยกว่าศูนย์) (ความคิดเห็นถูกข้ามด้วยคำตอบที่ยอมรับของ @ LưuVĩnhPhúc)
AFH

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

2
มันจะมีประโยชน์ที่จะเห็นสูตรยาว นอกจากเซลล์งานเป็นไปได้ที่จะกำหนดชื่อในแผ่นงานที่มีสูตร
datatoo

3

คุณต้องการให้ผลลัพธ์เป็น""เท็จหรือไม่? หากคุณต้องการให้เซลล์ดูว่างเปล่า (เช่นคุณจะไม่ใช้สิ่งที่ต้องการ=ISNUMBER()ในภายหลัง) คุณสามารถใช้การจัดรูปแบบตามเงื่อนไขเพื่อซ่อนเนื้อหาในกรณีที่ผิด

รูปแบบที่มีเงื่อนไขที่คุณจะนำไปใช้กับเซลล์เพื่อที่จะไม่แสดงสิ่งใดเป็นรูปแบบที่กำหนดเอง""เช่นนี้ (เป็นภาษาโปรตุเกส แต่คุณได้รับแนวคิด):

รูปแบบที่กำหนดเองสำหรับเซลล์ว่าง

=!X!+A1สูตรในเซลล์จะเป็นไปตามคาดเพียง

สูตรการจัดรูปแบบตามเงื่อนไขอาจเป็นได้=!X!=0แต่นั่นอาจเป็นการบังคับให้คำนวณซ้ำ!X!ซึ่งคุณไม่ต้องการ ("จุด 2" ของคุณ) มันจะดีกว่าที่จะควบคุมมือถือของตัวเองโดยใช้=B1=A1(เผื่อว่ามือถือของเราจะB1 ) - !X! = 0ที่จะบ่งบอกถึง

แม้ว่าคุณต้องการให้เนื้อหาของเซลล์เป็นจริง ""โดยปกติแล้วการแก้ไขเล็กน้อยสามารถทำได้ในแผ่นงานเพื่อให้สามารถใช้วิธีการนี้ได้ หากเป็นกรณีนี้ให้ใส่ความคิดเห็นที่อธิบายถึงสถานการณ์


1

ฉันไม่มีความเป็นไปได้ที่จะเพิ่มคอลัมน์ความช่วยเหลือ ขอบคุณอยู่ดี

หากคุณไม่สามารถเพิ่มคอลัมน์ผู้ช่วยได้ทำไมไม่เพิ่มทั้งแผ่นงาน มีข้อดีหลายประการดังนี้:

  • เซลล์ตัวช่วยของคุณไม่ใช้พื้นที่ที่อาจใช้เป็นอย่างอื่นเนื่องจากอยู่ในแผ่นงานแยกต่างหาก
  • คุณสามารถตั้งชื่อเซลล์ตามด้วยชื่อเช่น=IF(X<>0,X+A1,"")
  • หากคุณต้องการทำสิ่งนี้ในเซลล์มากกว่าหนึ่งเซลล์คุณสามารถ:
    1. เปลี่ยนชื่อแผ่นงานผู้ช่วย "helper"
    2. ใส่สมผู้ช่วยในเซลล์เดียวกันเป็นสมการหลัก D5(ขอเรียกว่า
    3. ระบุที่อยู่ของเซลล์เช่นเดียวกับhelper!D5ในแผ่นงานหลัก
  • คุณสามารถซ่อนแผ่นผู้ช่วยถ้าจำเป็น
  • มันเร็วกว่าการประเมินสองเท่า
  • ไม่สูญเสียความแม่นยำ

ข้อเสียที่ฉันเห็นคือ:

  • คุณต้องอ้างอิงเซลล์ที่ไม่มีชื่อในแผ่นหลักแทนเช่นเดียวกับที่sheetname!D5D5
  • ตอนนี้สูตรอยู่ในสองส่วนแทนที่จะเป็นหนึ่งส่วน
  • การเพิ่มจำนวนแผ่นงาน

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


1
คำตอบที่ดี ข้อเสียที่ฉันเห็นคือ: 1. มันไม่ได้ช่วยอะไรมากมายนักในการคำนวณให้กับผู้ใช้ง่ายขึ้นเนื่องจากตอนนี้สูตรที่ยิ่งใหญ่ถูกซ่อนอยู่ 2. สมุดงานจำนวนมากอัดแน่นไปด้วยแผ่นงาน แม้ว่าคุณซ่อนมันคุณอาจต้องผ่านแผ่นงานที่ซ่อนอยู่จำนวนมากเพื่อเลิกซ่อน นอกเหนือจากนั้นมันเป็นทางออกที่ดี
André Chalella

@ AndréNevesขอบคุณสำหรับสิ่งนั้น! อันแรกนั้นเกิดขึ้นกับฉัน แต่ฉันลืมมันไปตามเวลาที่ฉันกำลังเขียนหัวข้อข้อเสีย
wizzwizz4

1

ตัวเลือกที่ยังไม่แนะนำคือการสร้างฟังก์ชั่นที่ผู้ใช้กำหนด คุณจะต้องเปิดแท็บนักพัฒนาซอฟต์แวร์ในแถบเมนู (google it) และสร้างโมดูล

 public function udf_myCalc(ValueToAdd as double)
    dim myvar as double
    dim udf_myCalc as double
    myvar = .. put the logic of !X! in here

    if myvar<>0 then 
        udf_myCalc = myvar + ValueToAdd
    else
        udf_myCalc = ValueToAdd
    end if
 end function

ในแถบสูตรคุณจะต้องทำ

=udf_myCalc(A1)

หมายเหตุ: ตอนนี้กลายเป็นไฟล์. xlsx (พร้อมมาโคร) และอาจต้องมีการอนุญาตเพิ่มเติมในเครือข่ายขององค์กรเนื่องจากสามารถใช้มาโครได้เพื่อวัตถุประสงค์ที่เป็นอันตรายและตัวกรองอีเมลบางตัวจะปิดกั้นพวกเขา ฟังก์ชั่นนั้นไม่มีเอกสารดังนั้นคุณจะต้องให้บันทึกสิ่งที่ฟังก์ชั่นของคุณกำลังทำอยู่และฉันพบว่ามีประโยชน์ในการเรียกใช้ฟังก์ชั่นทั้งหมดของฉัน udf_xxxxx เพื่อให้ชัดเจนว่าไม่ใช่ฟังก์ชันในตัว

มี GOTCHAs อื่น ๆ ที่มี UDF ด้วยเช่นกัน ดูลิงค์นี้สำหรับเคล็ดลับที่ดี http://www.decisionmodels.com/calcsecretsj.htm

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.