Just nu i M3-nätverket
Jump to content

Problem med egen funktion vid import av data i Excel


Monshi

Recommended Posts

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

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

 

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

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

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

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

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

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

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

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

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...