Excel 2010 Range.FormulaArray โดยใช้ Range.Replace


3

ฉันกำลังพยายามทำงานประจำวันโดยอัตโนมัติที่ฉันใช้สูตรอาร์เรย์ INDEX () + MATCH () เพื่อดึงข้อมูลบางอย่างจากสมุดงานที่แตกต่างกันเป็นสมุดงาน 'ต้นแบบ' หนึ่งเล่ม สิ่งนี้ทำงานได้ด้วยตนเอง แต่ตอนนี้ฉันต้องการทำให้กระบวนการนี้เป็นแบบอัตโนมัติ

ฉันใช้ขีด จำกัด 255 ตัวอักษรของคุณสมบัติ Range.FormulaArray และพยายามที่จะหลีกเลี่ยงมันโดยใช้ลูกเล่นที่จัดเตรียมไว้ที่นี่แต่ไม่มีโชค

เมื่อเรียกใช้รหัสนี้ส่วน p1 ของสูตรจะถูกแทรกลงในช่วง แต่จะไม่ถูกเรียกใช้งาน 2. แทนที่

ฉันลองใช้ชุดส่วน "What" ที่แตกต่างกันของฟังก์ชัน. แทนที่ทั้ง "X_X_X ()" และ "{0}" และอีกมากมายที่ไม่มีโชค

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim p1, p2, p3 As String
p1 = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
p2 = "B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B"
p3 = "C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C"

With ws.Range("R2")
    .FormulaArray = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
    .Replace "{0}", p2
    .Replace "{1}", p3
End With

สูตรที่ฉันวางด้วยตนเองคือ:

=IF(G2<>"";INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P;MATCH(1;(B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B)*(C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C);0));"")

คุณสามารถวางทางลัดด้วยชื่อที่ถูกตัดทอนไปยังไฟล์ได้โดยตรงC:\ หรือไม่? ดังนั้นC:\path\to\[The_Document_Here.xls]จะกลายเป็นC:\thedoc.xls
JaredT

คุณต้องการสูตรหรือเพียงผลลัพธ์หรือไม่
Raystafarian

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

1
ฉันหมายถึงคุณสามารถใช้สูตรเบื้องหลังและใส่ผลลัพธ์ลงในเซลล์ได้หรือไม่
Raystafarian

ปัญหาคืออะไร คุณได้รับข้อความแสดงข้อผิดพลาดหรือไม่?
MátéJuhász

คำตอบ:


2

ฉันจัดการเพื่อแก้ไขมันโดยการกำหนดชื่อสำหรับช่วงในเวิร์กบุ๊กภายนอกในเวิร์กบุ๊ก 'ต้นแบบ' โดยการทำเช่นนั้นฉันจะรักษาสูตรให้ต่ำกว่าขีด จำกัด 255 อักขระของ. FormulaArray นอนหลับฝันดีและมีปัญหากับทุกอย่างคือ :-)


1

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

Sub qwerty()
    ActiveCell.Formula = "=MAX(IF(A2>B1:B12,B1:B12))"
    With Application
        .SendKeys "{F2}" ' get into edit mode
        .SendKeys "^+~" '  use CNTRL + Shift = Enter
    End With
End Sub

แก้ไข # 1:

แมโครนี้ควรจะเรียกใช้จากหน้าต่างExcelแทนที่จะเป็นหน้าต่างVBE


1
หากฉันลองทำเช่นนั้นฉันจะได้รับข้อผิดพลาด "ต้องระบุสตริงการค้นหา":
bwedel

1
@bwedel SORRY .............. คุณต้องเรียกใช้สิ่งนี้จากหน้าต่างExcelแทนที่จะเป็นหน้าต่างVBE !
นักเรียนของ Gary

นี่เป็นวิธีเดียวที่ฉันทำให้มันทำงานกับสูตรอาร์เรย์ได้ ฉันต้องบังคับให้คำนวณใหม่ของสูตรอาร์เรย์และไม่มีอะไรอื่นที่ฉันพยายามใช้งาน: หนังสือเล่มเต็ม, recalc แผ่นงาน, ช่วง recalc, (สิ่งเหล่านี้ไม่มีผลกระทบ) การตั้งค่า range.FormulaArray (สิ่งนี้ผลิต "ไม่สามารถรับคุณสมบัติ FormulaArray ของ คลาสของช่วง ")
Mr. TA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.