Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 59627 Skopiuj do schowka Bez użycia słowa Set
Autor Wiadomość
apollo
ExcelSpec


Pomógł: 1194 razy
Posty: 4109
Wysłany: 04-12-2017, 22:26   Bez użycia słowa Set

Przyda się trochę relaksu ;-)
Normalnie piszemy po bożemu ;-)
Kod:

Sub test()
Dim rng As Range
    On Error Resume Next
    Set rng = Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=8)
    If rng Is Nothing Then
        MsgBox "Nie wybrano żadnego obszaru"
    Else
        MsgBox "Wybrano obszar " & rng.Address
    End If
End Sub

Czy i jeśli tak to jak można nie użyć słowa Set?
Można np.
Kod:

Sub test()
Dim rng As Range
    On Error Resume Next
    With Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=8)
        MsgBox "Wybrano obszar " & .Address
        If Err.Number Then MsgBox "Nie wybrano żadnego obszaru"
    End With
End Sub

Ale jeśli kod jest bardzo długi i używamy wybranego obszaru w różnych miejscach to wygodnie zapamiętać go w zmiennej.
Pytanie: jak zapamiętać wybrany obszar w zmiennej ale nie używać słowa Set?
ID posta: 335546 Skopiuj do schowka
 
 
Artik 



Pomógł: 2575 razy
Posty: 8488
Wysłany: 05-12-2017, 01:17   

Mi wyszło tak:
Kod:
Sub test_2()
    Dim sAdres      As String

    On Error Resume Next
   
    With Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=8)
        MsgBox "Wybrano obszar " & .Address

        sAdres = .Address(External:=True)

        If Err.Number Then MsgBox "Nie wybrano żadnego obszaru"
    End With


    If Len(sAdres) > 0 Then
        With Range(sAdres)
            .ClearContents
        End With
    End If
   
End Sub

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 335554 Skopiuj do schowka
 
 
Maciej Gonet
Excel Expert


Pomógł: 1183 razy
Posty: 4045
Wysłany: 05-12-2017, 10:33   

Nie wiem, czy o to chodziło, ale można też wykorzystać tablicę w zmiennej Variantowej.
Kod:
Sub TestNotSet()
  Dim A
  On Error Resume Next
  A = Array(Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=8))
  MsgBox "Wybrano obszar " & A(0).Address
  If Err Then MsgBox "Nie wybrano żadnego obszaru"
End Sub
ID posta: 335568 Skopiuj do schowka
 
 
Artik 



Pomógł: 2575 razy
Posty: 8488
Wysłany: 05-12-2017, 10:42   

No, chytre, chytre. :clap

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 335569 Skopiuj do schowka
 
 
Maciej Gonet
Excel Expert


Pomógł: 1183 razy
Posty: 4045
Wysłany: 05-12-2017, 10:46   

Jeszcze inny sposób, z wykorzystaniem nazwy arkuszowej:
Kod:
Sub TestName()
  On Error Resume Next
  ThisWorkbook.Names.Add "obszar", Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=8)
  MsgBox "Wybrano obszar " & ThisWorkbook.Names("obszar").RefersTo
  If Err Then MsgBox "Nie wybrano żadnego obszaru"
End Sub
ID posta: 335570 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Pomógł: 2026 razy
Posty: 6726
Wysłany: 05-12-2017, 10:46   

Artik, ale to to samo co pokazał Apollo, chyba że źle go zrozumiałem.
Wydaje mi się że chodzi o innej metody niż powyżej pokazane.
Można np. zakres zapisać w kolekcji Name.
Kod:
 ActiveWorkbook.Names.Add _
        Name:="NazwaObszaru", RefersTo:="=Arkusz1!$A$1:$D$3"
i później odwoływać się do nazwy.
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
ID posta: 335571 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1194 razy
Posty: 4109
Wysłany: 05-12-2017, 14:09   

Artik napisał/a:
Mi wyszło tak:

Brawo Artika. Kluczowe to External:=True. Bo jeden kolega (nie wiem, czy mogę podać nick) podał na priv podobne ale bez External:=True, czyli nie ma informacji o arkuszu, więc dalej nie można użyć Range.

Marecki napisał/a:
Artik, ale to to samo co pokazał Apollo

Prawie to samo. Specjalnie nie zapamiętałem Address w zmiennej. Bo bez tej zmiennej nie można używać Range później. Chyba że używamy gigantyczny blok With ... End With, co jest nie wygodne jak pisałem. Tak więc Artik ma zaliczenie ;-)

Maciej Gonet napisał/a:
Nie wiem, czy o to chodziło

Mistrzostwo. Tak, jeśli chodzi o sedno, filozofię to chodziło mi o to. Różnimy się tylko jakieś 1% w realizacji.
Kod:

Sub test1()
Dim rng
    rng = Application.InputBox("Wybierz obszar", "Wybieranie Range", Type:=Array(8))
    If VarType(rng(1)) = vbBoolean Then
        MsgBox "Nie wybrano obszaru"
    Else
        MsgBox "Wybrano obszar " & rng(1).Address(External:=True)
        With rng(1)
            .Offset(.Rows.Count, .Columns.Count).Value = .Value
        End With
    End If
End Sub

Uwaga: nie mam obsługi błędów, dlatego muszę mieć Type:=Array(8). Jeśli mamy Type:=8 a user wybierze Cancel to mamy błąd wykonania, trzeba ręcznie resetować.
--------------
Tak naprawdę chciałem przy okazji pokazać najsmaczniejszy kąsek.
Kod:

Sub test2()
Dim k As Long, rng()
'    wybierz kolejnych 5 obszarów za każdym razem klikając OK. Jeśli chcesz
'    zrezygnować z jakiegoś obszaru to kliknij Cancel
    rng = Application.InputBox("Wybierz do 5 obszarów", "Wybieranie Range", Type:=Array(8, 8, 8, 8, 8))
    For k = 1 To 5
        If VarType(rng(k)) = vbBoolean Then
            MsgBox "Nie wybrano obszaru " & k
        Else
            MsgBox "Wybrano obszar " & k & " = " & rng(k).Address & " na arkuszu " & rng(k).Parent.Name
            With rng(k)
                .Offset(.Rows.Count, .Columns.Count).Value = .Value
            End With
        End If
    Next k
End Sub


A praktyczne zadanie? Kod zapisuje wybrany obszar jako obraz, razem z opisem, do pliku o podanej nazwie.
Kod:

Sub test3()
Dim k As Long, rng()
'    wybierz obszar, podaj opis, podaj nazwę.
'    Kod zapisze wybrany obszar jako obraz z opisem do pliku o podanej nazwie w katalogu pliku Excel
    rng = Application.InputBox("Podaj dane", _
                    Array("Wybieranie Range", "Opis obrazu", "Nazwa pliku obrazu"), Type:=Array(8, 2, 2))
    For k = 1 To 3
        If VarType(rng(k)) = vbBoolean Then
            MsgBox "Nie poprawne dane"
            Exit Sub
        End If
    Next k
    MsgBox "Wybrano obszar " & rng(1).Address & " na arkuszu " & rng(1).Parent.Name
    MsgBox "Opis obrazu: " & rng(2)
    MsgBox "Nazwa pliku: " & rng(3)
'    Kod zapisuje obszar do pliku obrazu
End Sub
ID posta: 335588 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe