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

Stänga av referenstyp R1C1 VBA mac 2010


jansor

Rekommendera Poster

Hej

 

Kanske en fråga på fel ställe men. Kan man stänga av R1C1 som referenstyp i vba excel 2010 för mac?

Alltså i VBA?

Länk till kommentar
Dela på andra webbplatser

menar du att du vill ställa om hur du på arbetsbladet skriver referenser?

Application.ReferenceStyle = xlR1C1 / xlA1

för att skifta mellan dem.

 

Eller menar du hur du anger i de olika formaten i VBA?

Länk till kommentar
Dela på andra webbplatser

Hej

 

Jag vill ha koden, om det går att skriva så generellt vilket jag inte tror, men som man skriver i excel tex a1 /a2.

Det går ju ändra så att man skriver R1C1 i excel men hittar ingen motsvarande funktion i vba.

Jag håller på att läsa in mej på vba. Menar du att man måste skriva in ändringen?

Länk till kommentar
Dela på andra webbplatser

Jag har fattat principen med detta

 

ActiveCell.FormulaR1C1 = "=R[-2]C/R[-1]C" Men det skulle vara enklare inledningsvis att få läsa a1/a2 istället.

Men jag anar att det inte går.

Länk till kommentar
Dela på andra webbplatser

Du kan skriva antingen

Me.Range("a1").Formula = "=a2"

eller

Me.Range("a1").FormulaR1C1 = "=R[1]C"

Ger samma resultat

Precis som

Me.Range("a1").Formula = "=a$2"

eller

Me.Range("a1").FormulaR1C1 = "=R2C"

 

 

Dock oftast enklast att hålla sig R1C1 formatet i VBA.

Länk till kommentar
Dela på andra webbplatser

Men hur ser man att Me.Range("a1").Formula = "=a2" är = a1 / a2?

Som sagt jag håller på lär mej språket.

Länk till kommentar
Dela på andra webbplatser

I VBA finns det två sätt att ange formler.

Antingen ger man via relativa referenser, dvs R1C1, eller så ger man vi absoluta referenser, dvs med cellnamn/adresser.

 

Vi kan som exempel ge en funktion som ska summer tio celler.

Om vi skriver

Blad1.Range("B1").FormulaR1C1 = "=SUM(RC[-1]:R[9]C[-1])"

dyker det i cell B1 upp formeln

=SUMMA(A1:A11)

Skriver vi istället

Blad1.Range("D10").FormulaR1C1 = "=SUM(RC[-1]:R[9]C[-1])"

blir resultatet

=SUMMA(C10:C19)

 

Detta är alltså skriver med relativa referenser.

 

Om vi skriver

Blad1.Range("C1").Formula = "=SUM(A1:A10)"

så får vi

=SUMMA(A1:A10)

i celler C1

Precis om

Blad1.Range("E10").Formula = "=SUM(A1:A10)"

ger även denna formeln

=SUMMA(A1:A10)

fast nu i E10

A1, A10 är direkta referenser till cellerna, cellernas namn. (Har du definierat egna namn/referenser i Excel kan du använda även dem).

 

Din fråga..när du skriver

Blad1.Range("E10").Formula = "=...

så förväntar sig Excel att ... ersättas av ett utryck som kan evalueras på arbetsbladet. Precis som när du förhand matar in en formel, om det blir fel kommer Excel/VBA generera ett fel.

 

Tips: Om du undrar hur en formel ska skrivas i VBA, med engelska namn och engelsk notation, spela in ett makro där du matar in formel. Då kan du se hur själva formeln kan skrivas men släng/skriv om koden. Det som makron genererar är inte bra kod

//eforum.idg.se/topic/220943-riktlinjer-for-bra-vba-kod/

Länk till kommentar
Dela på andra webbplatser

Ok Då hajar jag. Men varför skrivs relativa och absoluta referenser i vba så svårläst jämfört med direkta?

Länk till kommentar
Dela på andra webbplatser

Glömde en sak Följande går väl inte att spela in som Makro

Blad1.Range("C1").Formula = "=SUM(A1:A10)" De måste skrivas in eller hur?

Länk till kommentar
Dela på andra webbplatser

Angående inspelning av makron:

Inspelningen är som inspelningen är inte mer med det. Vad som spelas in går inte att styra och bör ej heller användas i den form det spelats in. Det finns alltför mycket skräp i den koden, såsom Activate, ActiveCell, Selection och Select. Onda saker som ska bort bort.

Skrivit mer om dem här

//eforum.idg.se/topic/220943-riktlinjer-for-bra-vba-kod/

 

With-sats är smidigt.

Vi kan jämföra dessa två satser

Dim myRn As Range
Set myRn = Blad1.Range("A1")
myRn.Interior.ColorIndex = 5
myRn.Interior.Pattern = xlPatternCrissCross
myRn.Font.Bold = True
myRn.Font.ColorIndex = 3
myRn = "Hello World"

 

samt

With Blad1.Range("a1")
With .Interior
   	.ColorIndex = 5
   	.Pattern = xlPatternCrissCross
End With
With .Font
   	.Bold = True
   	.ColorIndex = 3
End With
.Value = "Hello World"
End With

båda är ganska städade ochmed att de använder en korrekt metod för referering till målcell. Den andra är dock, i mina och de flestas ögon, mycket lättare att dels skriva men även att hantera, utöka samt få överblick över och förstå.

Helt enkelt ett enkelt sätt att hålla reda på referenser och vad man egentligen arbetar med.

Länk till kommentar
Dela på andra webbplatser

Jag brukar använda Cells så mycket som möjligt:

Range("A1:J10").Value = 99 är likvärdigt med Range(Cells(1,1),Cells(10,10)).Value = 99 mycket enklare att använda när man programmerar FOR-satser och liknande.

Länk till kommentar
Dela på andra webbplatser

Om vi ska prata teknikaliteter Tune, så är du helt rätt ute. Cells är mer praktiskt, inte minst när man loopar eller stegar relativt något.

Om jag ska ut på bladet och härja ser jag helst att det finns en nanmgiven cell som ankare för aktionen och sedan arbetar jag utifrån denna.

Typ

Range("myCell").Cells(1,2) ="Bredvid cellen"

Om jag ska stega genom celler, då skriver jag ofta

Set myRn = range("myCell").Resize(100,1)
For Each c  in myRn

Inte alltid dock, ofta stegar jag med index. Men ett trevligt alternativ.

 

Eller för att ta samma exempel som du

Range("A1").Resize(10,1) =99

Länk till kommentar
Dela på andra webbplatser

Om vi ska prata teknikaliteter Tune, så är du helt rätt ute. Cells är mer praktiskt, inte minst när man loopar eller stegar relativt något.

Anledningen till att jag skrev det var att man måste kunna släppa användandet av vanliga absoluta referenser som är det dominerande sättet att skriva referenser i excelblad. Man kommer inte speciellt långt annars. Finns massor med smidiga varianter att skapa referenser i VBA.

Länk till kommentar
Dela på andra webbplatser

Det känns som om jag skulle kunna detta bra när jag lärt mej språket bättre.

Men det känns en så länge som att få i sig en elefant med sugrör.Så jag får ta den i skivor :-)

Om vi nu för enkelhets skull skulle dissekera en kod som du skrev til mej i ett tidigare inlägg.

Jag vet ju vad den gör men vill kunna förstår språket.

 

Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next

If Target.Address = Me.Range("j2").Address Or Target.Address = Me.Range("j5").Address Then

Target.Offset(1) = Target + Target.Offset(1)

End If

End Sub

 

1 Change(ByVal Target As Range) Vad gör den texten exakt ?

 

2 Sen om jag skulle beskriva hur jag läser detta Om måladressen Me Range j2 eller måladress Me Range j5

då Target. Offset(1) Här fattar jag inte = Target + Target.Offset(1) Fattar inte

End If

End Sub

Länk till kommentar
Dela på andra webbplatser

1.

Private Sub Worksheet_Change(ByVal Target As Range)

är en händelsefunktion definierad i Excel.

ByVal indikerar att variabeln, Target, skickar som värde och inte referens. I praktiken innebär det inte så mycket för dig men i teorin innebär det att om du i koden ändrar adressen för Target slår detta inte igenom utanför just denna funktion.

 

2.

ja, IF -satsen ger att om adressen för cellen som ändrats är J2 eller J5 då exekveras det inom If-satsen

 

2 b.

Target.Offset(1) = Target + Target.Offset(1)

Offset = förskjutning.

Grundformen är

expression.Offset(RowOffset, ColumnOffset)

där då det andra argumentet inte är nödvändigt.

Target.Offest(1) innebär helt enkelt cellen under Target, i praktiken i denna kod cell J3 eller J6.

Denna cell tilldelas summan av Target plus sig själv.

 

Klarare?

Länk till kommentar
Dela på andra webbplatser

Ok Om jag nu skulle översätta detta till mitt kunnande.

Om det sker något i j2 eller j5 (alltså om variabeln target skickar som värde då är cellen under target = target + sig själv eller hur?

Länk till kommentar
Dela på andra webbplatser

ByVal innebär inte att du enbart får värdet, du får fortfarande en variabel den sort du önskat. Dvs Target är en referens till cellen som ändrats.

Ändras cell J2 är Target = J2.

Target.Offset(1) = Target + Target.Offset(1)

blir helt enkelt

J3 = J2 + J3

och operationen ger att värdena i J2 och J3 summeras och J3 får detta värde.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...