2015-02-07, 22:35
  #1
Medlem
Trillskes avatar
Vid installation av office satt jag och lekte lite med words developer-funktioner och kom på något jag reagerat på förut och fortfarande inte lärt mig. Fetmarkerat:
Kod:
Sub Whatevs()

    Dim Word_ As String
    Dim loop_ As String

    Word_ = InputBox("Please write something")
    
    loop_ = InputBox("How many times do you want to write this?")

    If Not IsNumeric(loop_) Then
        MsgBox (loop_ & " is not a number dummy!")
        Exit Sub
    End If

    For i = 1 To loop_

        Selection.TypeText Word_
    
    Next i

End Sub
Detta fungerar som det ska, vilket innebär att strängen loop_ antingen kan tolkas som en int eller att det fakiskt görs om till en int (alternativt något annat om mer minne krävs). Jag förusätter det förstnämnda eftersom det låter ganska hazard att lite godtyckligt kasta om programmerarens allokeringar.

Här stöter vi dock på patrull:
Kod:
Dim loop_ As Integer 

loop_ = "HEJ!" 
D.v.s. en sträng kan användas som en int men inte tvärt om.

Är det någon här som kan förklara hur VB/VBA egentligen hanterar strängar som siffror? Är det generellt gångbart eller något specifict för just VB?

Anledningen till frågan är att jag vet att jag vid tillfällen utfört matematiska operationer på strängar - och har heller inte någonsin stött på problem, men eftersom jag inte vet hur det fungerar har jag varit lite nojig. Inte helt sällan kan det vara rätt katastrofalt om några begränsningar kan generera fel svar, eftersom problemet då ofta är helt dolt. D.v.s. buggen upptäcks först under årsredovisning eller något annat kul.
Citera
2015-02-08, 03:41
  #2
Medlem
revodnebs avatar
Du har ju funktionen isNumeric, den borde lösa ditt problem?

https://msdn.microsoft.com/en-us/lib...=vs.90%29.aspx
Citera
2015-02-08, 04:10
  #3
Medlem
Trillskes avatar
Citat:
Ursprungligen postat av revodneb
Du har ju funktionen isNumeric, den borde lösa ditt problem?

https://msdn.microsoft.com/en-us/lib...=vs.90%29.aspx
Ehm, jag använder isNumeric i koden ovan.

Kan jag tolka detta som att om isNumeric leverar true så kan variabeln matematisk behandlas precis som en integer d.v.s. alla operationer är giltiga som om det vore en integer?
Citat:
It also returns True if Expression is a Char or String that can be successfully converted to a number.
Citera
2015-02-08, 05:51
  #4
Medlem
revodnebs avatar
Citat:
Ursprungligen postat av Trillske
Här stöter vi dock på patrull:
Kod:
Dim loop_ As Integer 

loop_ = "HEJ!" 
D.v.s. en sträng kan användas som en int men inte tvärt om.

Jag får revidera mitt statement - du är dum i huvudet. En integer är inte en string - tyvärr!
Citera
2015-02-08, 17:30
  #5
Medlem
Trillskes avatar
Citat:
Ursprungligen postat av revodneb
Jag får revidera mitt statement - du är dum i huvudet. En integer är inte en string - tyvärr!
Undrar vem som är dum i huvudet, kan det vara den einstein som tror att IsNumeric är någon slags ovanlig och hemlig funktion, speciellt när det är är den enda funktion som används i trådstarten?

För att försöka rädda tråden du går rätt in och sabbar behöver jag påpeka att det för det första inte är frågan om huruvida en integer är en string eftersom vb inte ens kan hantera en integer som en string. För det andra är det heller inte frågan om en string är en integer, frågan är om en string kan behandlas matematiskt precis som en integer givet att strängen är en siffra.

Mod får gärna ta bort dina inlägg.

EDIT: vill då passa på att tillägga att det finns ingen som helst mening någonsin att starta en forumtråd om IsNumeric-liknande funktioner, det är idioti. Hur dålig du än är på att googla kommer du hitta den typen av funktioner på under 30 sekunder.
__________________
Senast redigerad av Trillske 2015-02-08 kl. 17:50.
Citera
2015-02-08, 23:43
  #6
Medlem
revodnebs avatar
Citat:
Ursprungligen postat av Trillske
Undrar vem som är dum i huvudet, kan det vara den einstein som tror att IsNumeric är någon slags ovanlig och hemlig funktion, speciellt när det är är den enda funktion som används i trådstarten?

För att försöka rädda tråden du går rätt in och sabbar behöver jag påpeka att det för det första inte är frågan om huruvida en integer är en string eftersom vb inte ens kan hantera en integer som en string. För det andra är det heller inte frågan om en string är en integer, frågan är om en string kan behandlas matematiskt precis som en integer givet att strängen är en siffra.

Mod får gärna ta bort dina inlägg.

EDIT: vill då passa på att tillägga att det finns ingen som helst mening någonsin att starta en forumtråd om IsNumeric-liknande funktioner, det är idioti. Hur dålig du än är på att googla kommer du hitta den typen av funktioner på under 30 sekunder.

Sorry om jag pajade din tråd, vete fan vad som flög i mig?

Edit:

Jag tror att det är så att vb förväntar sig en integer i en for next loop och gör en type cast till en integer, tror det kallas "implicit type conversion". Det resulterar i att din kod blir långsammare.
__________________
Senast redigerad av revodneb 2015-02-09 kl. 00:40.
Citera
2015-02-09, 00:49
  #7
Medlem
revodnebs avatar
En sak till:

Ett for-next statement är väl egentligen ett anrop till en funktion medan du i ditt andra exempel direkt försöker tilldela en int-variabel ett strängvärde.
Citera
2015-02-14, 02:41
  #8
Medlem
TMMs avatar
Jag är fortfarande inte helt säker på vad det är du tänkt göra, men ska du konvertera strängar som enbart innehåller numeriska värden borde väl Convert.ToInt32() eller liknande fungera?
Citera
2015-03-10, 21:08
  #9
Moderator
Protons avatar
Citat:
Ursprungligen postat av TMM
Jag är fortfarande inte helt säker på vad det är du tänkt göra, men ska du konvertera strängar som enbart innehåller numeriska värden borde väl Convert.ToInt32() eller liknande fungera?
Om det är .NET ja, men det kan det ju inte gärna vara, för då hade tråden legat i det forumet, right?

Att konvertera till intar i VB Classic görs med kommandot CInt(string) och inget annat.

För att återgå till grundfrågan, har du Option Explicit längst upp i ditt VBA-makro? Tror det kan göra skillnaden mellan den implicita typkonverteringen och en som du måste sköta själv om inte makrot ska pajja.
Citera
2015-03-11, 00:48
  #10
Medlem
cyberbanans avatar
Vad är det egentligen du funderar på TS? Vill du veta mer exakt hur en sträng görs om (tolkas) som heltal eller vad är egentligen frågan?

Jag vet inte exakt, men jag antar att ASCII-koderna (eller nån annan teckentabell kanske) för varje tecken i strängen plussas ihop. Förmodligen plussas inte värdena ihop rakt av. Blir rätt oanvändbart heltalsvärde man får då.

Du kan ju kolla hur många varv din loop snurrar beroende på hur din sträng ser ut.

Du kan ju också kolla om "HEJ" och "HJE" ger samma heltalsvärde (antal var i loopen). Blir det olika värden så plussas ju inte character-koderna ihop på det enklaste sättet. Kanske ett positionssystem används? Dvs på samma sätt som 123 ej är samma som 132. Siffran*10^pos ger värdet för varje siffra i decimala positionssystemet. Kanske används nåt liknande för strängar? Ifall detta sätt används borde det dock gå att gå från heltalsvärde till sträng också. Så formodligen används väl nån typ av hashfunktion som genererar en "checksum" (men man kan inte utifrån resultatet gå tillbaka till ursprungsvärdet).
Citera
2015-03-24, 20:45
  #11
Medlem
JSelwyns avatar
O du kan inte låta loopen gå runt beroendes på teckenlängd då?

Hej=3 ggr
Strul=5 ggr
...osv

Använd funktionen Len(mystring) som sen returnerar en Integer.
https://msdn.microsoft.com/en-us/vst...(v=vs.12).aspx

Är ej heller riktigt säker på vad du vill åstadkomma...sorry.
Citera
2015-04-15, 03:55
  #12
Medlem
Trillskes avatar
Citat:
Ursprungligen postat av cyberbanan
Vad är det egentligen du funderar på TS? Vill du veta mer exakt hur en sträng görs om (tolkas) som heltal eller vad är egentligen frågan?
Precis detta jag funderade på.

Det är möjligt att option explicit förbjuder automatisk typecasting, men ändå intressant att veta hur saker fungerar (eller snarare störigt att inte veta hur saker fungerar).
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in