Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Avsluta macro i macro

Postades av 2004-09-13 08:23:04 - Jesper Liedberg, i forum visual basic - allmänt, Tråden har 5 Kommentarer och lästs av 900 personer

Hejsan

Jag har en modul som kontrollerar personnummer. Om man hittar ett felaktigt personnummer ska hela macrot avslutas och inte bara modulen. Någon som har någon lösning på detta?

Jesse


Svara

Sv: Avsluta macro i macro

Postades av 2004-09-13 09:57:24 - Åsa Holmgren

Med macro, menar du ett macro i Word eller Excel?

I exemplet nedanför avslutas makrot/subrutinen "MittMakro" om funktionen "KollaPersonnummer" returnerar "False".

<code>

Public Sub MittMakro()
Dim sPersonnummer As String

sPersonnummer = Selection
If KollaPersonnummer(sPersonnummer) = True Then
' Kod som körs om personnumret var giltigt
MsgBox sPersonnummer & " är ett giltigt personnummer."
End If
End Sub

Private Function KollaPersonnummer(ByVal vsPnr As String) As Boolean
' kod för att kontrollera personnumret
' KollaPersonnumret sätts till "True" om personnumret var korrekt
End Function

</code>


Svara

Sv: Avsluta macro i macro

Postades av 2004-09-13 10:46:20 - Jesper Liedberg

Hej

Det är rätt att det är ett macro i Excel.

Personnummermodulen ser ut som följer:

<Code>
Public Sub pnrKontroll(pStr As String)

Dim StrRaknare As String
Dim NamnStr As String
Dim Int1 As Integer
Dim Resultat2 As Integer
Dim Resultat1 As Integer
Dim b As Integer
Dim i As Integer
Dim Int2 As Integer
Dim Siffra As Integer
Dim pRow As Long
Dim pCol As Long
Dim fName As String

endIndex = Cells(Rows.Count, "A").End(xlUp).Row 'Cells(4, "A").End(xlDown).Row
tTecken = "-"
With ActiveSheet.UsedRange
For pRow = 3 To endIndex
pCol = 3
pStr = pStr & CStr(.Cells(pRow, pCol))

If InStr(pStr, "-") Then
MsgBox ("Kontrollera att du inte har ett bindestreck på rad " & pRow)
Exit Sub

Else
End If

StrRaknare = ""
Int1 = 0
Int2 = 0
Siffra = 0
NamnStr = Left(pStr, 6) & Right(pStr, 4)

For b = 1 To Len(NamnStr)
Siffra = Mid(NamnStr, b, 1)
Select Case b
Case 1
StrRaknare = StrRaknare & (Siffra * 2)
Case 3
StrRaknare = StrRaknare & (Siffra * 2)
Case 5
StrRaknare = StrRaknare & (Siffra * 2)
Case 7
StrRaknare = StrRaknare & (Siffra * 2)
Case 9
StrRaknare = StrRaknare & (Siffra * 2)
Case Else
StrRaknare = StrRaknare & Siffra
End Select
Next b

For i = 1 To Len(StrRaknare)
Int1 = Int1 + Mid(StrRaknare, i, 1)
Next i

If Right(Int1, 1) <> 0 Then
Int2 = (Left(Int1, 1) + 1) * 10
Resultat1 = Int2 - Int1
If Right(NamnStr, 1) <> Resultat1 Then
MsgBox "Personnummret på rad " & pRow & " är inte rätt ifyllt, var god kontrollera
inmatningen !", vbInformation, "Personnummer felaktigt"
Exit Sub

End If
Else
Resultat2 = Int2 / 10
If Right(NamnStr, 1) = Resultat2 Then
MsgBox "Personnummret på rad " & pRow & " är inte rätt ifyllt, var god kontrollera
inmatningen !", vbInformation, "Personnummer felaktigt"
Exit Sub

End If
End If
pStr = ""
Next pRow
End With

End Sub
</Code>

Denna modul exekveras med en Call pnrKontroll i huvudmacrot sparaCmd_Click()

<Code>
Public Sub sparaCmd_Click()

Dim sFilename As String
Dim sRow As String
Dim nCol As Long
Dim nRow As Long
Dim nFile As Integer
Dim nFile1 As Integer
Dim nFile2 As Integer
Dim tmpArray() As String
Dim strIn As String
Dim sTmp As String
Dim pStr As String
Dim fName As String
Const DELIM As String = ";"
Dim Lastrow As Integer

Call RemoveEmptyRows
Lastrow = Cells(Rows.Count, "A").End(xlUp).Row
Call pnrKontroll(pStr)

fName = InputBox("Var vänlig ange namn på filen som ska skickas")
sFilename = fName & ".txt"
nFile = FreeFile
Open ActiveWorkbook.Path & "\" & sFilename For Output As #nFile

With ActiveSheet.UsedRange
For nRow = 3 To Lastrow
sRow = ""
For nCol = 1 To .Columns.Count
If sRow <> "" Then sRow = sRow & DELIM
sRow = sRow & CStr(.Cells(nRow, nCol))
Next nCol
Print #nFile, sRow
Next nRow
End With
Close #nFile

nFile1 = FreeFile
Open ActiveWorkbook.Path & "\" & sFilename For Input As #nFile1
nFile2 = FreeFile
Open ActiveWorkbook.Path & "\" & "tempFil.txt" For Output As #nFile2
Do Until EOF(nFile1)
Line Input #nFile1, strIn
tmpArray = Split(strIn, ";")
sTmp = ("H1;IN" & ";H2;" & tmpArray(0) & ";H3;" & tmpArray(1) & ";H4;19" & tmpArray(2) & ";H5;"
& tmpArray(3) & ";H6;" & tmpArray(4) & ";H7;" & tmpArray(5) & ";CR")
Print #nFile2, sTmp
Loop

Close #nFile1
Close #nFile2
Kill ActiveWorkbook.Path & "\" & sFilename
Name ActiveWorkbook.Path & "\" & "tempFil.txt" As ActiveWorkbook.Path & "\" & fName & ".txt"
NumRows = 0

End Sub
</Code>

Som ni ser får man frågan om att ange filnamn även om ett personnummer är felaktigt, det är det jag vill få bort. Då tänkte jag att om man får en träff på ett felaktigt personnummer ska fortsättningen på macrot avbrytas, går det att ordna på något enkelt sätt. Jag förstod inte riktigt hur jag ska kunna implementera excemplet Åsa gav utan att behöva skriva om stora delat av macrot, det kanske går men jag vet som sagt inte hur.

Hoppas denna förklaring hjälper.


Svara

Sv: Avsluta macro i macro

Postades av 2004-09-13 12:42:06 - Åsa Holmgren

Mitt exempel i din tappning skulle se ut så här:

<code>
Private Function pnrKontroll() As Boolean
Dim StrRaknare As String
Dim NamnStr As String
Dim Int1 As Integer
Dim Resultat2 As Integer
Dim Resultat1 As Integer
Dim b As Integer
Dim i As Integer
Dim Int2 As Integer
Dim Siffra As Integer
Dim pRow As Long
Dim pCol As Long
Dim fName As String
Dim endIndex As Long
Dim tTecken As String
Dim pStr As String

endIndex = Cells(Rows.Count, "A").End(xlUp).Row 'Cells(4, "A").End(xlDown).Row
tTecken = "-"
With ActiveSheet.UsedRange
For pRow = 3 To endIndex
pCol = 3
pStr = pStr & CStr(.Cells(pRow, pCol))

If InStr(pStr, "-") Then
MsgBox ("Kontrollera att du inte har ett bindestreck på rad " & pRow)
Exit Function
End If

StrRaknare = ""
Int1 = 0
Int2 = 0
Siffra = 0
NamnStr = Left(pStr, 6) & Right(pStr, 4)

For b = 1 To Len(NamnStr)
Siffra = Mid(NamnStr, b, 1)
Select Case b
Case 1
StrRaknare = StrRaknare & (Siffra * 2)
Case 3
StrRaknare = StrRaknare & (Siffra * 2)
Case 5
StrRaknare = StrRaknare & (Siffra * 2)
Case 7
StrRaknare = StrRaknare & (Siffra * 2)
Case 9
StrRaknare = StrRaknare & (Siffra * 2)
Case Else
StrRaknare = StrRaknare & Siffra
End Select
Next b

For i = 1 To Len(StrRaknare)
Int1 = Int1 + Mid(StrRaknare, i, 1)
Next i

If Right(Int1, 1) <> 0 Then
Int2 = (Left(Int1, 1) + 1) * 10
Resultat1 = Int2 - Int1
If Right(NamnStr, 1) <> Resultat1 Then
MsgBox "Personnummret på rad " & pRow & " är inte rätt ifyllt, " _
& "var god kontrollera inmatningen !", _
vbInformation, "Personnummer felaktigt"
Exit Function
End If
Else
Resultat2 = Int2 / 10
If Right(NamnStr, 1) = Resultat2 Then
MsgBox "Personnummret på rad " & pRow & " är inte rätt ifyllt, " _
& "var god kontrollera inmatningen !", _
vbInformation, "Personnummer felaktigt"
Exit Function
End If
End If
pStr = ""
Next pRow
End With

pnrKontroll = True
End Function
</code>

<code>
Public Sub sparaCmd_Click()
Dim sFilename As String
Dim sRow As String
Dim nCol As Long
Dim nRow As Long
Dim nFile As Integer
Dim nFile1 As Integer
Dim nFile2 As Integer
Dim tmpArray() As String
Dim strIn As String
Dim sTmp As String
Dim pStr As String
Dim fName As String
Const DELIM As String = ";"
Dim Lastrow As Integer
Dim NumRows As Long

Call RemoveEmptyRows
Lastrow = Cells(Rows.Count, "A").End(xlUp).Row

If pnrKontroll() = True Then
fName = InputBox("Var vänlig ange namn på filen som ska skickas")
sFilename = fName & ".txt"
nFile = FreeFile
Open ActiveWorkbook.Path & "\" & sFilename For Output As #nFile

With ActiveSheet.UsedRange
For nRow = 3 To Lastrow
sRow = ""
For nCol = 1 To .Columns.Count
If sRow <> "" Then sRow = sRow & DELIM
sRow = sRow & CStr(.Cells(nRow, nCol))
Next nCol
Print #nFile, sRow
Next nRow
End With
Close #nFile

nFile1 = FreeFile
Open ActiveWorkbook.Path & "\" & sFilename For Input As #nFile1
nFile2 = FreeFile
Open ActiveWorkbook.Path & "\" & "tempFil.txt" For Output As #nFile2
Do Until EOF(nFile1)
Line Input #nFile1, strIn
tmpArray = Split(strIn, ";")
sTmp = ("H1;IN" & ";H2;" & tmpArray(0) & ";H3;" & tmpArray(1) _
& ";H4;19" & tmpArray(2) & ";H5;" & tmpArray(3) & ";H6;" _
& tmpArray(4) & ";H7;" & tmpArray(5) & ";CR")
Print #nFile2, sTmp
Loop

Close #nFile1
Close #nFile2
Kill ActiveWorkbook.Path & "\" & sFilename
Name ActiveWorkbook.Path & "\" & "tempFil.txt" As ActiveWorkbook.Path _
& "\" & fName & ".txt"
NumRows = 0
End If
End Sub
</code>


Svara

Sv: Avsluta macro i macro

Postades av 2004-09-13 12:47:10 - Åsa Holmgren

Ett litet PS om hur du kan förkorta din CASE-sats betydligt:

<code>
For b = 1 To Len(NamnStr)
Siffra = Mid(NamnStr, b, 1)
Select Case b
Case 1, 3, 5, 7, 9
StrRaknare = StrRaknare & (Siffra * 2)
Case Else
StrRaknare = StrRaknare & Siffra
End Select
Next b
</code>


Svara

Sv: Avsluta macro i macro

Postades av 2004-09-14 08:35:06 - Jesper Liedberg

Det fungerade perfekt. Tack så mycket för hjälpen.

Jesse


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 710
27 958
271 751
830
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies