Monshi Posted September 27, 2004 Share Posted September 27, 2004 Jag har skapat en egen funktion att använda i en av min arbetsböcker i Excel. Denna funktion ska använda data i en cell om importeras via en webbfråga. Dock, när man importerar data fungerar inte funktionen. Problemet är att man inte verkar kunna nå cellernas inre egenskaper vid hämtning av en webbfråga Exempelvis funktionen: [color="#0000ff"]Function[/color] str_length_text(target As Range) As Variant [color="#0000ff"]On Error[/color] GoTo ErrorHandler str_length_text = [color="#0000ff"]Len[/color](target.Text) [color="#0000ff"]Exit[/color] [color="#0000ff"]Function[/color] ErrorHandler: str_length_text = Err.Number & [GRÅ]" "[/GRÅ] & Err.Description [color="#0000ff"]End[/color] [color="#0000ff"]Function[/color] hoppar in i felhanteringen om target är en cell inom en webbfråga medans [color="#0000ff"]Function[/color] str_length(target As Range) As Integer str_length = [color="#0000ff"]Len[/color](target) [color="#0000ff"]End[/color] [color="#0000ff"]Function[/color] fungerar. Nu vill jag nå de inre egenskaperna, inte just dessa som används i exemplet de använder jag bara för att de var enkla. Går det att komma runt detta problem på något sätt? En exempelfil med just dessa funktioner och en webbfråga hittar ni här: http://w1.876.telia.com/%7Eu87639880/tipset/problemet.xls /T Even when we know we´ll never find the answers, we have to keep on asking questions. Link to comment Share on other sites More sharing options...
MH Posted September 27, 2004 Share Posted September 27, 2004 om man byter str_length_text = Len(target.Text) mot str_length_text = Len(target.Value) Så fungerar det. Verkar vara ett sånt där fånigt fel. Vet faktiskt inte vad *. text står för egentligen, antar att det är *.value man skall använda. vad är det för inre egenskaper (låter som en kontaktanons) som du sökte egentligen? Hmm, kan det ha med format att göra? *.text skall alltid returnera Stringformaterat medan *. value returnerar variant. Ny tycker man kanske att Len borde föredra ett strängformaterat värde, men men... Nej, fungerar inte att köra str() heller, skumt /m Link to comment Share on other sites More sharing options...
Monshi Posted September 27, 2004 Author Share Posted September 27, 2004 Det jag vill åt är: target.Characters(Start:=4, Length:=5).Font.ColorIndex Det går att lösa genom att exekvera koden i VBA gemom ett anrop där. Enda är att om det går så föredrar jag att ha formlerna på arket. Om man möblerar om finns det alltid risk att en i VBA hårdkodad adress pekar fel. Jag ger dig en ny fil att leka med, en tagen ur den verkliga situationen från mitt tipsark http://w1.876.telia.com/%7Eu87639880/tipset/prob2.xls /T Even when we know we´ll never find the answers, we have to keep on asking questions. Link to comment Share on other sites More sharing options...
MH Posted September 27, 2004 Share Posted September 27, 2004 Vafnn, ger upp! trodde att ja hade hittat ett mönster, men så var det inte, grrr. Du får sätta bevakning (huvaligen) på webb-tabellen och tvinga fram en Application.CalculateFull Buuuh Eller lite trevligare, gör en knapp som både uppdaterar tabellen och kör en CalculateFull Har du ställt ner uppdateringen på något sätt? kan inte se det någonstans) Det är verkligen skumt. Target.value Target.address Target.Application Target.count fungerar, men inte Target.text gäller även längre ner i trädet, men inte konsekvent. skumt skumt skumt Link to comment Share on other sites More sharing options...
Monshi Posted September 27, 2004 Author Share Posted September 27, 2004 Skulle tro att de som inte fungerar är de anrop som ska nå/kräver specifika format på innehållet i cellen. .value returnerar alltid innehållet i cellen, .text ger felmeddelande om cellen inte innehåller text osv. Men men varför fungerar Application.CalculateFull men inte range("..."").Calcuate eller sheets("...").Calculate? Inte hela världen att räkna om hela arbetsboken, det tar under en sekund. Webbfrågan startas för övrigt via VBA-kod så något problem att starta en beräkning av hela applikationen är det inte. Det känns dock lite onödigt, finns det verkligen inget annat sätt? Tänk om man samtidigt har en jättearbetsbok öppen med flera stora Pivottabeller! Inte troligt, men... Kanske då bättre att låta VBA-koden exekvera funktionen och skriva ut datat på rätt plats i arbetsboken. Måste bara hålla reda på 3x13 celler att hämta data ifrån och 1x13 att skriva till. (mmh, blir färre beräkningar eftersom på arbetsbladet skulle jag skriva ut funktionen i 3x13 celler) /T Even when we know we´ll never find the answers, we have to keep on asking questions. [inlägget ändrat 2004-09-27 20:10:37 av Monshi] Link to comment Share on other sites More sharing options...
MH Posted September 27, 2004 Share Posted September 27, 2004 varför fungerar Application.CalculateFull men inte range("..."").Calcuate eller sheets("...").Calculate? Därför att världen är ond? Du fär vara glad att du inte behöver köra CalculateFullRebuild. Låter ännu värre Jag tror att CalculateFullRebuild i XP motsvarar CalculateFull i XL 2000, så det finns en risk för att det kommer att gå segare i xl 2000 :-(. Föressten, är det här samma Tipsprojekt som förde in dig i Eforums XL-träsk verkar vara i ständig utveckling Link to comment Share on other sites More sharing options...
Monshi Posted September 27, 2004 Author Share Posted September 27, 2004 Föressten, är det här samma Tipsprojekt som förde in dig i Eforums XL-träsk verkar vara i ständig utveckling Jodå, det har tagit en nystart nu med försök att implementera lite mer funktioner i arket. Måste dock ta det lite försiktigt, något av det jag skapat senaste dagarna verkar ta lite tid att exekveras. Arket börjar kanske bli lite väl belamrat med mer eller mindre nödvändig funktionalitet. /T Even when we know we´ll never find the answers, we have to keep on asking questions. Link to comment Share on other sites More sharing options...
Monshi Posted September 28, 2004 Author Share Posted September 28, 2004 Ok, nu har jag hittat en omväg att lösa detta på. En ganska smidig omväg. Om jag har en bunt egna formler på arbetsbladet som direkt eller indirekt påverkas av en webbfråga, jag det är bara att göra dem beroende av en cell som inte beror av webbfråga. Till denna cell skriver man med VBA kod ett godtyckligt värde efter uppdateringen av webbfrågan och vips exekveras den egna funktion korrekt. Ex.v. skriv ett värde med VBA till cell A1, i A2 finns en webbfråga. Lämplig formel: =OM(A1:game_ended(A2);game_ended(A2)) Finns säker en anledning till varför man måste göra på detta vis. /T Even when we know we´ll never find the answers, we have to keep on asking questions. Link to comment Share on other sites More sharing options...
MH Posted September 28, 2004 Share Posted September 28, 2004 Finns säker en anledning till varför man måste göra på detta vis.Ja , världen är ond . Det är ett märkligt beteende. Jag roade mig med att lägga en "egen funktions-formel" i ett annat blad och länka till ditt frågeblad. Trodde det löste problemet, men det berode på att dom inte uppdaterades alls.... Om man skall filosofera mer (ditt problem är ju löst), hur anropar man en webbfråga i vba) Eller rättare sagt, är Webbfrågan en del av bladet eller ligger den "egentligen" som ett eget objekt med egna regler? finns säkert någon hemlig liten uppdateringsegenskap man bara kan ange via VBA. Excel är väldigt smidigt, men ibland.... Link to comment Share on other sites More sharing options...
Monshi Posted September 28, 2004 Author Share Posted September 28, 2004 En webbfråga ges alltid ett namn när du skapar den. Du kan ändra namnet till det du önskar varvid det är enkelt att anropa den via VBA. Mitt anrop, kanske inte nödvändigt med hela sökvägen, är: webbSheet.QueryTables("TextTV 377").Refresh (False) där webbSheet är satt till just det blad där frågan finns. Du kan exakt styra din webbfråga via VBA, allt du kan ställa in via GUI (och lite till?) går att ändra via VBA. (måste sätta mig in i felhanteringen, inte alltid det går som man önskar. Ex.v. en koll på hur länge en fråga kan vänta på svar från en webbsida vore inte fel). Webbfrågan är med andra ord ett objekt på sidan. Jag kör den via VBA just för att kunna exekvera en del kod efter att nya data hämtats. Funktionen som styr hela systemet körs med ett bestämt tidsintervall genom anropet: Application.OnTime(...) /T Even when we know we´ll never find the answers, we have to keep on asking questions. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.