Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: odwolywanie sie do komorek w excelu
anonim




Typ: Nie zarejestrowany
odwolywanie sie do komorek w excelu

Czy jest mozliwe takie zaadresowanie komorki w makrze  w excelu tak, zeby po dodaniu wiersza czy kolumny przed ta komorka w arkuszu, makro odwolywalo sie do zmienionej komorki. Chodzi mi o to, ze jak w makrze napisze np. Range("E5", to jak dodam wyzej wiersz w arkuszu to chce zeby w makrze bylo Range("E6". Mam nadzieje ze sie w miare zrozumiale wyrazilem. Dzieki za pomoc.

08-01-2005 20:24
  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Należy skorzystać z nazw, to znaczy danemu zakresowi, czy komórce w opcji menu  Wstaw/Nazwa/Definiuj przyporządkować w arkuszu np. MojArkusz  nazwę np. zakresowi $A$9:$A$12 nazwę MojZakres.
Po wstawieniu wiersza czy kolumny adresy nazwanego zakresu automatycznie się przesuną.
Odwołujemy się w kodzie i w formułach również do nazwanego zakresu też poprzez nazwę wówczas.


Sub ListowanieZakresu()
Dim iRow As Long
Dim maxRow As Long
Dim oRng As Range
With ThisWorkbook.Sheets("MojArkusz" ).Range("MojZakres" )
    maxRow = .Rows.Count
    For iRow = 1 To maxRow
        With .Cells(iRow, 1)
            Debug.Print .Value; .Address
        End With
    Next
End With
End Sub

Sub WstawWiersz()
ThisWorkbook.Sheets("MojArkusz" ).Range("$A$1" ).EntireRow.Insert
End Sub


_____________________________________________
Karolina

09-01-2005 04:20
Pokaż profil karolinavb  Wyślij email do karolinavb   
anonim




Typ: Nie zarejestrowany

Super, wielkie dzieki, wlasnie wprowadzilem sobie poprawki i wszystko mi dziala !!! :-)

09-01-2005 09:31
  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

I jeszcze może tak na marginesie dla tych co nie wiedzą oczywiście...

Bardzo nie lubię klikania po tych opcjach menu, jest uciążliwe przy projektowaniu skoroszytu gdy ciągle trzeba coś sprawdzać i poprawiać w nazwach i człowiek się ciągle myli...Korzystam zatem z wprowadzania nazw w kodzie  (gorąco zachęcam do korzystania z kodu przy projektowaniu skoroszytu nie tylko dla nazw, potem łatwiej wprowadzać zmiany) np. tak najprościej:

Sub WprowdzNazweZakresu()
    With ThisWorkbook.Sheets("MojArkusz" )
        .Names.Add Name:="MojCalkiemZakres", RefersTo:= _
        "=MojArkusz!$D$10:$E$22", Visible:=True
    End With
End Sub


A w zasadzie ze zbioru procedur jak przytoczyłam poniżej wraz z  komentarzami:

Option Explicit

Public Function NazwyZrodelWykaz() As Boolean

'''' przykładowe wprowadzanie nazw w kodzie VBA
On Error GoTo NazwyZrodelWykaz_Error

''''  nazwa arkusza
Dim strArkName As String
'''' nazwa zakresu
Dim strName As String
'''' wyrazenie opisujace zakres komorek
Dim strRefersTo As String

With ActiveWorkbook
    strArkName = "MojArkusz"

   
    '''' nazwę zakresu mozna poprzedzić nazwą akrusza
    '''' wówczas bedzie ona widoczna w okienku definiowania nazw
    '''' tylko gdy dany arkusz jest na wierzchu
    strName = strArkName & "!" & "MojCalkiemZakres"
    strRefersTo = "=MojArkusz!$A$10:$A$14"
    Call DodajNazweZakresu(strArkName, strName, strRefersTo)
   
    strName = strArkName & "!" & "Dane2"
   
    strRefersTo = "=OFFSET(" & strArkName _
        & "!$B$2,0,0,COUNTA(" & strArkName & "!$B$2:$B$65531),1)"

    '''' nazwa Dane2 - arkusz MojArkusz zakres komórek
    '''' od $B$2 do 1-szej nie pustej komórki w kolumnie
    '''' -- zalożenie że nie ma pustych komórek w środku zakresu
   
    Call DodajNazweZakresu(strArkName, strName, strRefersTo)
     
    '''' zakres nieciągły
    strName = strArkName & "!" & "NieciaglyZakres"
    strRefersTo = "=" & strArkName & "!$C$2:$C$4,$E$2:$E$4"
   
    Call DodajNazweZakresu(strArkName, strName, strRefersTo)

   
    '''' zakres z 2-ch arkuszy
    strName = strArkName & "!" & "NazwaDwaArkusze"
    Dim strDrugiArkusz As String
    strDrugiArkusz = "InnyArkusz"
   
    strRefersTo = "=" & strArkName & "!$H$1:$H$4," _
        & strDrugiArkusz & "!$H$1:$H$4"
       
    Call DodajNazweZakresu(strArkName, strName, strRefersTo)
End With

NazwyZrodelWykaz_Exit:
Exit Function
NazwyZrodelWykaz_Error:
MsgBox "Błąd - " & Err.Number & vbCrLf _
            & "Opis -  " & Err.Description & vbCrLf _
            & "Procedura - " & "NazwyZrodelWykaz", vbExclamation, "VBAProject - NazwyZrodeWykaz"
Resume NazwyZrodelWykaz_Exit
End Function

Public Function DodajNazweZakresu(ByVal strArkName As String, _
        ByVal strName As String, _
        ByVal strRefersTo As String) As Boolean
On Error GoTo DodajNazweZakresu_Error

With ActiveWorkbook
    If CzyjestNazwaOK(strArkName, strName, strRefersTo) = False Then
        .Names.Add Name:=strName, RefersTo:=strRefersTo, Visible:=True
    End If
    DodajNazweZakresu = True
End With


DodajNazweZakresu_Exit:
Exit Function

DodajNazweZakresu_Error:
MsgBox "Błąd - " & Err.Number & vbCrLf _
            & "Opis -  " & Err.Description & vbCrLf _
            & "Procedura - " & "DodajNazweZakresu", vbExclamation, "VBAProject - DodajNazweZakresu"
Resume DodajNazweZakresu_Exit
End Function

Public Function CzyjestNazwaOK(ByVal strArkName As String, _
        ByVal strName As String, _
        ByVal strRefersTo As String) As Boolean
On Error GoTo CzyjestNazwaOK_Error

Dim oName As Name
With ActiveWorkbook
    For Each oName In .Names
        If UCase(oName.RefersTo) = UCase(strRefersTo) And _
            UCase(oName.Name) = UCase(strName) Then
            CzyjestNazwaOK = True
            Exit For
        End If
    Next
End With

CzyjestNazwaOK_Exit:
Exit Function

CzyjestNazwaOK_Error:
MsgBox "Błąd - " & Err.Number & vbCrLf _
            & "Opis -  " & Err.Description & vbCrLf _
            & "Procedura - " & "CzyjestNazwaOK", vbExclamation, "VBAProject - CzyjeNazwaOK"
Resume CzyjestNazwaOK_Exit
End Function

Sub DrukujNazwyOkienkoImmediate()

'''' listowanie wszystkich zakresów do okienka Immediate
Dim oName As Name
    For Each oName In ActiveWorkbook.Names
      With oName
            Debug.Print "Nazwa: " _
                    & .Name & vbNewLine _
                    & "Zakres: " & .RefersTo _
                    & vbNewLine
        End With
    Next
End Sub

Sub UsunWszystkie()

'''' usuwanie wszystkich zakresów
Dim oName As Name
Dim strTytulMess As String
strTytulMess = ThisWorkbook.Name
If ActiveWorkbook.Names.Count > 0 Then
    If MsgBox(prompt:="Chcesz usunąć wszystkie nazwy ze skoroszutu ?", _
        Buttons:=vbOKCancel + vbExclamation, Title:=strTytulMess) = vbOK Then
        For Each oName In ActiveWorkbook.Names
            With oName
                Debug.Print "Nazwa: " _
                        & .Name & vbNewLine _
                        & "Zakres: " & .RefersTo _
                        & vbNewLine
                .Delete
            End With
        Next
        MsgBox prompt:="Wszystkie nazwy ze skoroszytu " _
            & strTytulMess & " usunięto !", Title:=strTytulMess
    Else
        MsgBox prompt:="Usuwanie nazw anulowano !", _
            Title:=strTytulMess, Buttons:=vbInformation
    End If
Else
    MsgBox prompt:="Brak nazw w skoroszycie " & strTytulMess, _
            Title:=strTytulMess, Buttons:=vbInformation
End If
End Sub


P.S.
Obsługa błędów wstawiana za pomocą ADD-INS  ze strony http://www.zada.com.au/accessaddins.htm ; --' ADD-INS Error Handler Builder dla Office (jest też dla VB) BARDZO POLECAM  to narzędzie (można sobie projektować treść kodu obsługi).
Inne narzędzie trochę bardziej uniwersalne to ze strony http://www.mztools.com/v3/download.htm dla VBA i VB, ma jeszcze dużo innych ciekawych ułatwień, w tym opcje  budowania łańcucha połączeń dla ADO, a także prosty konstruktor dokumentacji w formacie XML.
Piszę o nazwach dlatego,że jest to element bardzo ułatwiający projektowanie arkuszy.

[Post edytowany dnia 09-01-2005 13:32 przez karolinavb]


_____________________________________________
Karolina

09-01-2005 12:45
Pokaż profil karolinavb  Wyślij email do karolinavb   
Wszystkich odpowiedzi: 3 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1