Poszukiwanie podpowiedzi funkcji niestandardowej programu Excel

100

To pytanie został poproszony przed , ale za każdym razem Zaakceptowanych odpowiedź jest po prostu rezygnacja dostarczenie opisów funkcyjnych za pomocą Application.MacroOptions( VBA6 ) ( VBA7 ), ale informacja ta w rzeczywistości nie pojawiają się podpowiedzi, więc to nie rozwiązuje mojego problemu.

Cel

Wszyscy pragniemy mieć możliwość definiowania funkcji niestandardowych w dowolny sposób (dodatek VBA, VSTO lub COM) i dawać użytkownikowi korzyści w postaci wyskakującego / podpowiedzi do opisu funkcji i jej parametrów, jak pojawia się dla każdej wbudowanej funkcji programu Excel, w wierszu lub na pasku formuły:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Powszechnie akceptowaną odpowiedzią na tę potrzebę jest to, że niestandardowe funkcje nie są możliwe, ale chcę podważyć to przekonanie.

Problem

Obecnie najlepsze, co widziałem, to definiowanie funkcji (często przy użyciu powyższego wywołania MacroOptions), tak aby podczas wywoływania okna dialogowego funkcji (przycisk fx na pasku formuły) ich opisy funkcji i parametrów wyglądały jak poniżej:

wprowadź opis obrazu tutaj

Jak widać, jest to skomplikowana funkcja z wieloma parametrami. Jeśli użytkownik nie jest świadomy tego okna dialogowego „argumenty funkcji” i nie wie, jak je wywołać, a zamiast tego zna tylko standardową podpowiedź programu Excel, zobaczy tylko nazwę formuły bez dodatkowej pomocy:

wprowadź opis obrazu tutaj

Dzięki temu nie mają szans na poprawne podanie wymaganych parametrów. (Bez czytania dokumentacji, czego oczywiście żaden użytkownik nigdy nie robi.)

Teraz zaawansowany użytkownik może wiedzieć, że wpisując Ctrl+ Shift+ A, otrzyma automatycznie uzupełnianą listę parametrów funkcji, taką jak ta:

wprowadź opis obrazu tutaj

Ale oczywiście mamy ten sam problem, co powyżej, polegający na tym, że standardowi użytkownicy programu Excel będą przyzwyczajeni tylko do domyślnego zachowania z pierwszego obrazu i prawdopodobnie nigdy nie nauczyli się tej funkcji.

W tym momencie powinno być jasne, dlaczego to nie wystarczy i chcemy tego, co ma każda wbudowana funkcja - wbudowanej podpowiedzi, która mówi użytkownikowi, jak używać tej funkcji.

The Tease

Na początku mogłem być przekonany, że nie jest to po prostu możliwe, z wyjątkiem natywnych funkcji aplikacji Excel. Dodatki i język VBA to funkcje rozszerzalności, a ta wskazówka narzędziowa może po prostu nie być rozszerzalna. Jednak ta teoria jest kwestionowana przez istnienie dodatku Analysis Toolpak. Jasne, jest wbudowany w Microsoft, ale ANALYS32.xll to samodzielny dodatek XLL, podobnie jak te, które można utworzyć w VB, C, C ++ i C #. Rzeczywiście, po załadowaniu tego XLL do aplikacji funkcje, które udostępnia, mają te same wskazówki, co natywne funkcje programu Excel:

wprowadź opis obrazu tutaj

Z pewnością, jeśli te informacje zostaną w jakiś sposób zakodowane w tym pliku XLL i przesłane do programu Excel, czy istnieje sposób na ich odtworzenie za pomocą naszych własnych dodatków? Jestem teraz w punkcie, w którym zamierzam zacząć uczyć się trochę dekompilacji i sprawdzić, czy mogę odtworzyć wszystko, co dzieje się w pakiecie narzędzi do analizy.

Jak możesz pomóc

Jestem prawie pewien, że zapoznałem się ze wszystkimi publicznie dostępnymi informacjami na temat tego problemu. Jeśli ktoś wie coś, czego nie wiem, a co może w tym pomóc, nie krępuj się. Nie jestem zaznajomiony z inżynierią wsteczną skompilowanych bibliotek dll / xlls, więc jeśli ktoś ma ochotę otworzyć lokalną kopię Analysis32.xll i zastanawiając się, co się dzieje z jego definicjami funkcji niestandardowych, byłbym bardzo zobowiązany. W przeciwnym razie będę się w to zagłębiał, dopóki nie trafię we wszystkie ślepe zaułki i nie zdam raportu, co znalazłem.

Alain
źródło
4
Nie można tworzyć ani wyświetlać podpowiedzi dla argumentów UDF w aktualnych wersjach programu Excel przy użyciu żadnej z dostępnych technologii. Źródło przez MVP: answers.microsoft.com/en-us/office/forum/office_2007-customize/...
silkfire
.NET Reflector nie mógł otworzyć pliku ANALYS32.xll, stwierdzając, że nie jest to zestaw .NET. To mnie zaskakuje. Wygląda na to, że będę musiał spróbować zdekompilować go na język asemblera?
Alain
5
Brzmi interesująco, ale w przeszłości (w pakiecie Office 97) tworzyłem podpowiedzi przy użyciu winapi. I w ten sposób możesz to zrobić. Jeśli to interesujące, mogę wykopać informacje i spróbować na ich podstawie odpowiedzieć.
Archlight
1
Tobie też to zdobędę, wykopanie tego zajmie trochę czasu. Ale powinien się tu dostać, aby inni mogli z niego korzystać. To niskie i złe połączenie winapi / vba / i myślę, że zrobiłem to jako vb.dll, ale nie ma problemu z podniesieniem go do .net
Archlight
1
Najwyraźniej zespół programistów programu Excel zbiera
Alain

Odpowiedzi:

40

Wysłałem projekt weryfikujący koncepcję do GitHub jako projekt Excel-DNA IntelliSense , wdrażając go.

Używając klas automatyzacji interfejsu użytkownika do monitorowania odpowiednich zdarzeń interfejsu użytkownika programu Excel, odpowiedni formularz jest wyświetlany.

Kod jest zapakowany jako dodatek Excel-DNA i działa na moim komputerze Excel 2013 / Windows 8. Testowałem na jednej innej konfiguracji (64-bitowy program Excel 2010 w systemie Windows Server 2008) i miałem poważne problemy.

Dla funkcji C # zdefiniowanej za pomocą atrybutów Excel-DNA w następujący sposób:

[ExcelFunction(Description = 
    "A useful test function that adds two numbers, and returns the sum.")]
public static double AddThem(
    [ExcelArgument(Name = "Augend", 
                   Description = "is the first number, to which will be added")] 
    double v1,
    [ExcelArgument(Name = "Addend", 
                   Description = "is the second number that will be added")]     
    double v2)
{
    return v1 + v2;
}

otrzymujemy zarówno opis funkcji

Opis funkcji

a wybierając funkcję, otrzymujemy pomoc dotyczącą argumentów

Argument pomoc

Wygląda ładnie, ale nadal jest bardzo niestabilny, działa tylko na moim komputerze i czasami powoduje awarię programu Excel. Ale to może być początek ...


Aktualizacja 9 maja 2014:

Zrobiłem pewien postęp, zastanawiając się, jak sprawić, by argument help działał w starszych wersjach Excela i Windows. Jednak nadal wymaga sporo pracy, aby wszystko było niezawodne. Każdy, kto chciałby w tym pomóc, powinien skontaktować się bezpośrednio ze mną.


Aktualizacja 18 czerwca 2016 r .:

Obecnie testowana jest obsługa funkcji Excel UDF IntelliSense zarówno dla dodatków Excel-DNA, jak i funkcji VBA. Zobacz stronę Wprowadzenie w GitHub, aby uzyskać instrukcje.

Govert
źródło
Niestety, wygląda na to, że Excel 2013 lub Windows 8 lub oba są wymagane do obsługi UI Automation TextRange, z której korzysta argument help. Bardzo chciałbym usłyszeć od każdego, kto ma doświadczenie w automatyzacji interfejsu użytkownika systemu Windows ...
Govert,
Czy próbowałeś odwołać się do starszych zestawów programu Excel przed kompilacją na starszych komputerach?
Daniel Möller,
1
Odwołania do modelu obiektów programu Excel tak naprawdę nie są w to zaangażowane. Ale z pewnością są różne wersje automatyzacji interfejsu użytkownika, które mogą mieć wpływ na rzeczy ...
Govert,
1
To wszystko wyprzedza dotychczasowe ulice, więc masz mój głos na nagrodę. Zamierzam sprawdzić, czy w najbliższej przyszłości będę mógł wnieść swój wkład w to rozwiązanie, więc miej oko na moją prośbę o przyciągnięcie!
Alain,
@Alain Dobra robota dla Goverta! Alain, chciałbym zobaczyć, jak to opanujesz.
CodeCamper,
1

Co powiesz na

  1. Przechwytywanie wprowadzanego tekstu w przypadku naciśnięcia klawisza komórki. lubię to
  2. Sprawdź, czy tekst pasuje do funkcji niestandardowych.
  3. Jeśli pasuje, pokaż etykietę lub kształt, aby udawać wskazówkę. lubię to

Czy to jest dopuszczalne?

To trochę brzydkie, ale łatwiejsze.

Clxy
źródło
To interesujący punkt wyjścia, który rozważałem, ale napotkałem komplikacje, gdy napotkano bardziej zaawansowane formy edycji formuły (takie jak kliknięcie gdzieś pośrodku i usuwanie / dodawanie znaków lub podświetlanie i nadpisywanie części formuły lub użycie niestandardowa formuła w środku innej formuły.) Wymagają one czegoś więcej niż tylko sprawdzania naciśnięć klawiszy, musielibyśmy spojrzeć na bieżącą zawartość paska formuły lub komórki w trakcie edycji. Można to również osiągnąć za pomocą niektórych zaimportowanych bibliotek dll i poradzić sobie z włamaniem. Z pewnością warte poznania.
Alain,
-1

Co to jest XLL?

XLL to biblioteka DLL, która eksportuje kilka procedur wywoływanych przez program Excel lub Menedżera dodatków programu Excel. http://msdn.microsoft.com/en-us/library/office/bb687861.aspx

Jak rozwijasz XLL?

Excel XLL SDK z Visual C ++ (lub cokolwiek, co może skompilować DLL i wywołać procedury SDK)

Gdzie mogę znaleźć krótki przewodnik dotyczący tworzenia prostego XLL?

http://support.microsoft.com/kb/178474

Jak otrzymuję podpowiedzi?

  1. Zaimplementuj swoją funkcję jako procedurę i wyeksportuj ją
  2. Implementacja i eksport procedury xlAutoOpen (void) - http://msdn.microsoft.com/en-us/library/office/bb687860.aspx
  3. xlAutoOpen wystarczy zadzwonić do xlfRegister - http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
  4. W przypadku etykiet narzędzi należy zwrócić szczególną uwagę na: pxArgumentText, pxFunctionHelp, pxArgumentHelp1

Niestety, dodatek Analysis Toolpak również nie ma etykietek.

Moje rozwiązanie było błędne, ale oryginalny plakat zawierał błędne informacje. Wyświetlanie obrazu z BINOMDIST, jeśli jego link wyraźnie wskazuje, że nie jest to funkcja ANALYS32.xll.

Oznacza to, że próbowałem rozwiązać niemożliwe pytanie. Ponieważ nie ma XLL, który może zrobić to, o co prosił plakat. Jeśli znajdziesz wersję programu Excel, która wyświetla podpowiedzi dotyczące XLL, daj mi znać.

O to, o co pytał plakat, próbując naśladować zachowanie XLL, jestem pewien, że moja odpowiedź była najbardziej poprawna w odniesieniu do tego, co zrobi ANALYS32.xll.

Marcos Zolnowski
źródło
3
Niestety, zarejestrowanie UDF w xlfRegister nie powoduje, że Excel wyświetla te informacje jako etykietki narzędzi IntelliSense w arkuszu. Zarejestrowane tam opisy itp. Są wyświetlane tylko w oknie dialogowym Argumenty funkcji, które pojawia się po naciśnięciu przycisku fx. Ale nie o to pyta oryginalny plakat.
Govert
@Govert czy nadal tak jest teraz w 2016 roku?
beppe9000
@ beppe9000 Tak. Możesz pobrać etykietki narzędzi IntelliSense w arkuszu dla UDF (zdefiniowane w XLL lub VBA) za pomocą rozszerzenia Excel-DNA IntelliSense: github.com/Excel-DNA/IntelliSense
Govert