Just nu i M3-nätverket
Gå till innehåll

Excel Named Range Input från UserForm ─ Får bara felsvar...


MvS
 Share

Rekommendera Poster

Hej i forumet!

Håller på med ett litet (förmodligen totalt meningslöst) projekt där jag skapar en korsordshjälp i Excel. Men nu sitter jag här och har i vanlig ordning trasslat in mig i VBA-kod som bara genererar felsvar!
Verktyget jag skapat består av två fält med rutnät. I det högra fältet (Datafältet) är det meningen att man ska fylla i de numrerade rutorna från ett krypto. Detta fält speglas sedan i det vänstra fältet (Översiktsfältet) där man kan se resultatet. Det högra fältets numrering är kopplat till en bokstavskolumn som finns emellan de två övriga. Bokstavskolumnen innehåller upp numrerade  celler från 1 - 25 som man successivt fyller i. Det vänstra fältet är kopplat till både Bokstavsfältet och datafältet via bl a en LETARAD-funktion. 

Så allt fungerade perfekt till dess jag kom på att olika krypton är ju olika stora varför jag har via småstölder från diverse webbsidor satt mig före att göra detta dynamiskt med VBA-proceduren Resize som hämtar info från ett UserForm där man ska fylla i önskat värde (Rad & Kolumn antal). Har lyckats få Excel att hämta värden från formuläret men när jag sedan kommer till själva "Resize:n" så tar det stopp där jag bara får en dialogruta med "Körfel 1004: Program- eller Objektdefinierat fel". Har prövat mig fram men nu har det helt tagit stopp! Finns det någon vänlig själ därute som kan bibringa lite klarhet i vad jag gör för fel? Bifogar Bild samt själva Excelfilen (Zippad) här!

//Magnus   

Bild 1.jpg

Krypto.zip

Länk till kommentar
Dela på andra webbplatser

Snygg kod, bra struktur och ingen goto, nästan ingen select eller liknande vid första titt.

 

En sak, VBA-kod behöver inte låsa/låsa upp blad med än en gång.

 

  
    Me.Protect userinterfaceonly:=True
    Range("a1") = 1

kan köras en gång och VBA-koden kan sedan redigera allt på bladet men inte en vanlig användare.

 

Kanske inte felet men detta är ju bakvänt:

 With rngData
    Set rngData = wb.Names("Nummerkrypto").RefersToRange.CurrentRegion
    Set rngData = .RefersToRange.reSize(Cells, [sC] & ":" & [eC])
    Set rngData.Name = ("Nummerkrypto")
...
End With

På rad 1 sätter du att rngdata ska användas inom with - end.

På rad 2 sätts denna om och på rad 3 är du frågan om du refererar till rngData från rad 1 eller rad 2.

Ok, inte ett fel samma fel när jag tar bort With.

 

Men nästa då

Resize (RowSize, ColumnSize)

är formatet på resize.

Att skriva på format som du gör ovan har jag inte sett. Du får räkna fram antalet kolumer/rader som du ska utöka med (vilket du väl vet från input-formuläret?).

 

tänk om lite, jag sätter mig inte in i exakt vad du försöker göra.

 

Tips:

Öppna direktfönstret

Börja rad med ? så kan du där skriva kod som evalueras som test.

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Sent omsider ─ Tack Monshi för svar !

---------------

Löste detta första problem genom att formatera alla korsordsceller som kan användas och sedan med makro dölja/ta fram rad- och kolmun sektioner med hjälp av alternativknappar.

MEN i min strävan att utveckla det hela till ett användbart verktyg har jag stött på ett betydligt knepigare problem! 

I mitt verktyg finns det nämligen två källor som ska kunna uppdatera själva korsordet:
Kodordsfältet (bildfrågan) där bildgåtans bokstäver ska in och Bokstavsfältet, där resterande bokstäver fylls i för korsordets fullbordande (efter kodordet är klart)
Kodordsfältet är horisontellt liggande och bokstavsfältet vertikalt stående. Dessutom är det senare uppdelat i två kolumner av layouttekniska skäl. De dubbla bokstavsfälten (vertikala) har jag försökt sammanfoga till en kolumn på olika sätt: dels genom att helt sonika skapa en kolumn på blad2 med direktlänkar mellan cellerna, dels genom att i VBA göra en "Union". 

 

Jag vill alltså att den som använder verktyget ska kunna uppdatera korsordet från båda källorna ("Kodord" och "Bokstäver") men där kodordsfältet ska ha prioritet över bokstavsfältet så att om värden skrivs in där så uppdateras bokstavsfältet med de värdena (nummer och bokstav). Det innebär att dessa båda fältserier inte kan innehålla några formler utan det måste vara VBA-kod som sköter den funktionen. 

 

Jag har som sagt försökt med olika lösningar i VBA, framför allt att jobba med VLookup och HLookup men får inte till det!
Har bl a försökt kringgå problem genom att på Blad 2 i arbetsboken sammanfatta bokstavsfältets 2 kolumner i en för att förenkla datahanteringen. Men jag fastnar antingen med cirkelreferenser (i kolumnlänkar) eller i VBA med bla det djävulusist irriterande: "Objektvariabel eller With-blockvariabel har inte angetts:huh:, vilket gör att jag snart ger upp!

 

Har nu i flera veckors tid Googlat runt i akt och mening att hitta någon listig kodning som skulle kunna göra detta, men har hittills inte hittat något bra förklarande material eftersom jag inte är tillräckligt vass på VBA för att hänga med alla mer eller mindre krångliga utläggningar som ofta förekommer! 

 

Mitt huvudproblem har i alla fall nu kokat ner till hur man ska göra  för att uppdatera målceller från källceller, med eller utan VLookup/HLookup och jag skulle uppskatta enormt om jag kan få hjälp av någon välvillig  själ som kan detta.

Bifogar det jag hittills har lyckats knåpa ihop i form av en zippad makroaktiverad arbetsbok.

//Magnus

Arbetskopia_Korsord.zip

Länk till kommentar
Dela på andra webbplatser

Först en snabb titt på koden. Överlag bra MEN kod i en modul bör verkligen adressera explicit vilket blad den arbetar med. Dvs inte bara skriva Range("a1") = 9

utan gärna

Blad1.Range("A1") = 9

exempelvis.

Till din fråga... många ord och kanske lite för mycket information.
Trevligt med en bok att titta på men det hela gör mig inte mycket klokare tyvärr. Ett exempel på vad vi har och vad som önskas efter kan vara bra.

bryta ned allt till mindre problem.-

8 timmar sedan, skrev MvS:

"Objektvariabel eller With-blockvariabel har inte angetts

Kan mycket väl ha att göra med det jag kommenterade först, referenser utan att ange blad.



En liten kodsnutt lätt omskriven
 

Private Sub rad_15R15C_Click()

    Call Modul1.SkyddTaBort
    Dim RngUnion As Range
    With Blad1
        Set RngUnion = Union(.Range(outXsC), .Range(numXsC))
            If Not RngUnion Is Nothing Then
                RngUnion.EntireColumn.Hidden = False
                .Range(allXsR).EntireRow.Hidden = True
            End If
        Call Modul1.SkyddaBlad
    End With
End Sub

 

 

Iochmed att du i din SkyddaBlad sätter
 

 UserInterfaceOnly:=True

Måste du inte ta bort skyddet av bladet  för att VBA-koden ska kunna köras.

 

  • Tack 1
Länk till kommentar
Dela på andra webbplatser

 Share



×
×
  • Skapa nytt...