Áp dụng bất kỳ công thức n lần mà không sử dụng VBA? [đóng cửa]


6

Tôi có các ô sau:

A1:

justsometext

B1:

3

C1:

=DOSOMETHING(A1)

Tôi muốn áp dụng công thức trong C1n lần (n là 3, giá trị trong B1), vì vậy trong trường hợp này có nghĩa là:

C1:

=DOSOMETHING(DOSOMETHING(DOSOMETHING(A1)))

Có bất kỳ khả năng để làm điều này mà không cần một macro, có thể bằng cách sử dụng các công thức mảng?

CẬP NHẬT:

Số lần lặp lại sẽ không phải luôn luôn là 3, nhưng sẽ thay đổi theo thời gian và / hoặc khác nhau từ dòng này sang dòng khác.

Đây là một ví dụ đơn giản về những gì nó sẽ trông như thế nào:

Ảnh chụp màn hình của bảng mẫu

Xin lưu ý rằng giải pháp nên hoạt động cho bất kỳ công thức nào và không chỉ để nối thêm một chuỗi không đổi như trong ví dụ.


3
Bạn có một công thức cụ thể trong tâm trí bạn đang cố gắng chạy nhiều lần không? Điều này nghe có vẻ giống như một vấn đề XY tiềm năng . Bạn có thể mô tả ngắn gọn những gì bạn đang cố gắng thực hiện / * tại sao * để chạy công thức ba lần không? Theo một cách nào đó, những gì bạn đã sử dụng làm ví dụ ( =value&"_checked") sẽ có một cách khác so với việc bạn muốn chạy Index/Matchba lần hoặc lâu hơn ...
BruceWayne

Câu trả lời:


5

Sau đó tôi sẽ sử dụng = Value & REPT("_checked", NoOfExecutions).

Nếu bạn luôn cần phải làm những thứ như ví dụ (chuỗi nối), nó hoạt động khá tốt.

Nếu bạn cần sử dụng các công thức khác, đây là những gì tôi có thể nghĩ đến:

  • chúng tôi tách chức năng bạn sẽ cần sử dụng: bắt đầu (mọi thứ nên đi trước đối số chính) và kết thúc (bất kỳ điều gì tuân theo đối số, bao gồm cả đối số bổ sung). Ví dụ: nếu chúng ta sử dụng chức năng LEFT(value, 2), LEFT(sẽ đi vào Bắt đầu, , 2)trong Kết thúc.

  • chúng tôi xây dựng công thức dưới dạng văn bản với nối và REPT. Tham khảo ví dụ trong hình, công thức trong ô C6 sẽ là: = "=" &REPT($B$2,B6) & $A6 & REPT($B$3,$B6)

  • Sau đó, bạn cần sao chép ô và dán nó làm giá trị trong ô D6; sau đó nhấp vào công thức trong thanh công thức và nhấn Enter trên bàn phím của bạn.

Đó là một vài bước nhưng nó tránh được VBA.

Ảnh ví dụ


Xin vui lòng đọc làm rõ tôi thêm vào cuối câu hỏi. Một giải pháp chung là cần thiết.
robinCTS

Cảm ơn sự giúp đỡ của bạn, robinCTS; Tôi chỉ định viết một cái gì đó tương tự. Những gì tôi đang tìm kiếm là một giải pháp chung. Nhưng tốt đẹp để có giải pháp rất dễ dàng này cho nối chuỗi. Cảm ơn, VFor.
Scripter22

@ Scripter22 Bạn được chào đón. FYI, bạn cần phải @đăng ký tên người dùng để họ được ping nếu họ không phải là người đăng câu hỏi / câu trả lời mà bạn đang bình luận. Xem Làm thế nào để bình luận @replies hoạt động? để biết chi tiết đầy đủ.
robinCTS

Đẹp cố gắng cho một giải pháp chung! Mặc dù vậy, nó không hoạt động như OP dự định. Ý tưởng là cho phép n được thay đổi và có kết quả tự động cập nhật. Tuy nhiên, vấn đề chính là điều này chỉ hoạt động đối với một số công thức giới hạn trong đó "Giá trị" chỉ xảy ra một lần. (Ví dụ: =LEFT(A1,LEN(A1)-1)không thể mở rộng công thức đơn giản bằng cách sử dụng REPT().)
robinCTS

4

Không, xin lỗi, điều này là không thể đối với bất kỳ công thức nào cộng với việc nó tự động cập nhật. Không sử dụng VBA, đó là.

Tuy nhiên, nó có thể được thực hiện cho một số lượng rất nhỏ công thức cụ thể (như nối chuỗi không đổi). Nó cũng có thể được thực hiện, nhưng với cập nhật thủ công, đối với một bộ công thức nhất định như được hiển thị khéo léo trong câu trả lời của VFor .

Cách gần nhất mà bạn có thể nhận được cho một giải pháp chung là sắp xếp lại các ô, nhúng DOSOMETHINGcông thức vào công thức trình bao bọc đặc biệt và sử dụng các cột trợ giúp.

Đối với bảng tính ví dụ được cung cấp của bạn:

Ảnh chụp màn hình bảng tính hiển thị ví dụ OP

Sắp xếp lại nó như thế này:

Ảnh chụp màn hình bảng tính hiển thị sắp xếp lại

Nhập công thức sau vào D2và ctrl-enter / copy-paste / fill-down & right / auto-fill vào phần còn lại của các cột của bảng:

=IF(COLUMN()-COLUMN($C2)>$A2,"§",C2&"_checked")

Nhập công thức sau vào B2và ctrl-enter / copy-paste / fill-down / auto-fill vào phần còn lại của cột của bảng:

=INDEX(C2:INDEX(2:2,1,COLUMNS(2:2)),MATCH("§",C2:INDEX(2:2,1,COLUMNS(2:2)),0)-1)


Lưu ý rằng số lượng cột trợ giúp cần thiết là giá trị tối đa cho phép của n cộng với một. Nếu không có đủ chúng cho một giá trị được nhập, một lỗi sẽ xảy ra:

Ảnh chụp màn hình bảng tính hiển thị lỗi

Giải trình:

Công thức trình bao bọc tổng quát cho các cột của trình trợ giúp là:

=IF(COLUMN()-COLUMN($C2)>$A2,"§",DOSOMETHING(C2))

nơi DOSOMETHING(C2)được bất kỳ công thức dựa trên C2chỉ (ví dụ, LEFT(C2,LEN(C2)-1)mà dần dần loại bỏ các ký tự cuối cùng).

Công thức trình bao bọc hoạt động bằng cách vận hành trên ô bên trái, do đó "lồng" các công thức một cách hiệu quả hơn nữa vào bên phải trong hàng nó đi.

Phần này IF(COLUMN()-COLUMN($C2)>$A2,"§",sử dụng các chỉ mục cột để đếm số lần DOSOMETHINGcông thức được lồng và khi số lần được chỉ định trong cột Ađã đạt được, nó sẽ tạo ra các chuỗi kết thúc. Những chuỗi này không nhất thiết phải là §. Chúng chỉ cần là một cái gì đó sẽ không bao giờ là kết quả của việc đánh giá bất kỳ số lượng công thức lồng nhau nào cho bất kỳ cho phép Value.


Công Resultthức có vẻ phức tạp hơn. Tuy nhiên, các C2:INDEX(2:2, 1, COLUMNS(2:2))phần chỉ đơn giản là phạm vi phụ của hàng 2ở bên phải của Resultcột.

Công thức về cơ bản giống như:

=INDEX(2:2,MATCH("§",2:2,0)-1)

mà làm cho nó dễ hiểu hơn

(Lưu ý rằng công thức này thực sự hoạt động nếu tính toán lặp được bật.)

Nhìn vào công thức đơn giản hơn này, rõ ràng công thức trả về DOSOMETHINGkết quả hàm lồng nhau cấp n .


Tôi nghĩ rằng tôi chỉ viết một câu trả lời tương tự như thế này, nhưng hơi khác. Tôi nghĩ rằng câu trả lời của bạn dễ dàng hơn để sao chép dán trên ma trận của các cột trợ giúp nếu số lần lặp có thể là rất lớn. Câu trả lời của tôi có thể dễ thực hiện hơn nếu số lần lặp tối đa khá nhỏ. Câu trả lời rực rỡ!
Todd Wilcox

0

Để áp dụng Công thức trong Ô `C1 'n Số lần bạn cần áp dụng Lặp lại.

nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động:

  1. Bấm vào Tệp , Tùy chọn rồi Công thức .
  2. Tìm hộp kiểm Bật tính toán lặp và chỉ kiểm tra nó.
  3. Đối với Lặp lại tối đa, viết giá trị, ví dụ 5.
  4. Viết công thức này vào ô C1

=B1+C1

Bạn tìm thấy Excel tính toán Công thức trong C1năm lần.

Bạn có thể đặt Giá trị mới bao nhiêu lần bạn cần, bằng cách làm theo các bước từ 1 to 3.


1
Đó không phải là chính xác những gì tôi đang tìm kiếm. Tôi cập nhật câu hỏi để làm rõ.
Scripter22

@ Scripter22, bạn đã cập nhật câu hỏi sau khi được tôi trả lời tối qua ,, và đó không phải là một thực hành tốt. Bao nhiêu thời gian mọi người đang đầu tư vào đây để đăng một câu trả lời tốt và bạn đã thực hiện xoắn mà không xem xét nó !!
Rajesh S

@ Scripter22, ví dụ hiển thị cho chuỗi hậu tố n số lần và bạn đã thêm rằng phương thức được đề xuất nên áp dụng cho bất kỳ Công thức nào !! Tôi không thể hiểu những gì bạn đang cố gắng để đạt được, tốt hơn là cập nhật bài viết một cách chính xác ,, nếu không nó có thể thu hút để BỎ nó vào ĐÓNG !!
Rajesh S

@ Scripter22 ,, là người dùng Excel, bạn không thể hiểu rằng nếu không liên quan đến Ô Công thức, như Ô C1lặp lại thì bất kỳ số n Công thức nào cũng sẽ vô dụng. Giống như nếu bạn tái chế Công thức =SUM(A1:A5)5 lần trong Ô A6, mỗi lần nó sẽ trả về cùng một giá trị. Đó là lý do tôi đã cho thấy sử dụng ITERATION !!
Rajesh S

Câu hỏi là kém (và bây giờ đóng cửa). Mọi người không nên cố gắng trả lời nó bằng "giải pháp" ngoài việc giải thích tại sao không có giải pháp chung. Cho rằng, giải pháp của bạn là hợp lệ như những người khác, nhưng dường như đã được chỉ ra là người duy nhất nhận được downvote. Tôi bù đắp downvote để san bằng sân chơi. Nhưng đó là một ví dụ tốt về lý do tại sao nó nguy hiểm để trả lời các câu hỏi xấu.
fixer1234

0

Nó có thể được thực hiện thông qua các chức năng Đánh giá và Rept.

Đánh giá chỉ có thể được gọi thông qua trình quản lý tên, xem
chức năng đánh giá . Evalute đánh giá một chuỗi như một công thức, vì vậy bất cứ điều gì có thể được xây dựng như một chuỗi đều có thể được sử dụng làm công thức.

  • Nhấn Ctrl + F3, nhấn Mới ...

  • Trong trường Tên, đặt tên cho chức năng của bạn (ví dụ: Repeater)

  • Trong trường Tham chiếu, viết công thức của bạn, sử dụng Rept: = Evalu (rept ("sin (", b2) & a2 & rept (")", b2))

  • và trong ô của bạn, bạn sử dụng = Lặp lại và chỉ định số lần lặp lại trong B2 và tham số trong A2

Hơi khó một chút, vì vậy một công thức do người dùng xác định trong VBA có thể dễ dàng hơn


0

Điều này có vẻ hơi điên rồ, nhưng đó là một hack có thể giúp đỡ.

Giả sử cột A có tất cả các giá trị văn bản và cột B có số lần lặp bạn muốn. Cũng giả sử rằng có một giá trị tối đa cho cột B, như 4, để giải thích. Nếu bạn không thể có giá trị tối đa cho cột B, thì điều này sẽ không hoạt động.

Đầu tiên, thêm một hàng ở đầu có các số 1 - 4 ở đầu các cột C, D, E, F. Trong ô C2, đặt một công thức như thế này: =IF(C$1=$B2,DOSOMETHING(A2),"")(đối với phần cuối của công thức đó, hãy đặt ,"")nếu bạn đang làm việc với các chuỗi và ,0)nếu bạn đang làm việc với các số).

Sau đó, trong D2, đặt =IF(C$1=$B2,DOSOMETHING(DOSOMETHING(A2)),""). Và như vậy đối với E2 và F2. Bây giờ nếu bạn sao chép các ô C2 - F2 và dán chúng xuống các cột C - F, bạn sẽ nhận được ma trận kỳ lạ này, nơi mọi thứ đều trống (hoặc không) ngoại trừ các cột nơi bạn có giá trị bạn muốn dựa trên số lần lặp trong cột B.

Bây giờ cho cột cuối cùng (cột G trong ví dụ của tôi), nối (hoặc tổng, nếu làm việc với các số) bốn cột trước để lấy tập hợp các giá trị bạn cần tất cả trong một cột. Tùy chọn ẩn bốn cột tính toán.

Như thế này:

nhập mô tả hình ảnh ở đây


0

Tôi nghĩ rằng điều này là có thể trong trường hợp chung (với đệ quy)!

Về cơ bản, những gì chúng ta cần làm là thiết lập một hệ thống trong đó một ô truy cập (có tham chiếu đến chính nó) đếm đến số lần gọi hàm và mỗi khi số đó thay đổi thì hàm sẽ được chạy lại.

Bây giờ để làm cho điều này rõ ràng hơn, tôi đang sử dụng các công thức bảng. Bảng của tôi trông như thế này khi bắt đầu:

nhập mô tả hình ảnh ở đây

Bước đầu tiên là tạo tho Counter - Current Statecột chứa cái này

=IFS(
    resetSwitch,
    [@[Counter Initial State]],
    [@[Current State]] >= [@[Count To]],
    [@[Current State]],
    TRUE,
    [@[Current State]] + 1
)

Mà đọc

Nếu resetSwitch là True, hãy chuyển sang trạng thái ban đầu, nếu không hãy tiếp tục tăng giá trị của ô này cho đến khi chúng ta đạt đến giá trị cuối cùng ( [@[Count To]])

Bây giờ để xác định xem có nên áp dụng công thức (trong cột Công cụ) hay không, chúng ta cần biết bộ đếm có tăng hay không (Trạng thái hiện tại <Đếm), nếu vậy chúng ta áp dụng công thức. Một cách để làm điều này là lấy trạng thái trước của bộ đếm và nếu khác với trạng thái hiện tại, bộ đếm đang phát triển, nếu không bộ đếm đã đạt đến giá trị cuối cùng.

Các Previous Statecột chứa

=IFS(
    [@[Current State]] = [@[Counter Initial State]],
    [@[Counter Initial State]],
    [@[Current State]] < [@[Count To]],
    [@[Current State]],
    AND(
        [@[Count To]] = [@[Current State]],
        [@[Previous State]] < [@[Current State]] - 1
    ),
    [@[Previous State]] + 1,
    TRUE,
    [@[Count To]]
)

Mà đọc:

Nếu bộ đếm ở trạng thái ban đầu, nó phải có trước đó. Nếu bộ đếm hiện tại nhỏ hơn giá trị cuối cùng của nó, trạng thái trước đó của nó là ít hơn trạng thái hiện tại. Nếu bộ đếm ở trạng thái cuối cùng và giá trị hiện tại cho trạng thái trước thì không, thì trạng thái trước đó vẫn sẽ tăng. Nếu giá trị hiện tại của trạng thái trước là giá trị cuối thì bộ đếm ổn định ở trạng thái cuối cùng

Tôi nghĩ rằng cần phải có một tư duy không phải là Excel để hiểu ý tôi, nhưng tôi tin rằng nó hoạt động. Về cơ bản Previous Statelà một lần lặp lại phía sau Current State(như tên sẽ gợi ý)

Cuối cùng, chúng ta cần áp dụng công thức bất cứ khi nào trạng thái trước đó <> trạng thái hiện tại của bộ đếm (bộ đếm hiện đang tăng). Điều đó mang lại công thức trongRecursor

=IFS(
    resetSwitch,
    [@[Reursor Initial State]],
    [@[Previous State]] < [@[Current State]],
    [@Recursor] & "_checked",
    TRUE,
    [@Recursor]
)

Trường hợp ở đây công thức được áp dụng n lần là [@Recursor] & "_checked", nhưng có thể là bất kỳ f([@Recursor]).

Cài đặt resetSwitchthành FALSE làm cho mọi thứ chạy, dẫn đến

Sau khi nhấp


Nb này yêu cầu kích hoạt tính toán lặp , với số lần lặp được đặt thành số lớn hơn số lần tối đa bạn muốn áp dụng công thức
Greedo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.