Jak uniknąć używania Select w Excelu VBA

Słyszałem wiele o zrozumiałym odrazu używania .Select w Excelu VBA, ale nie wiem, jak go uniknąć. Stwierdzam, że mój kod byłby bardziej użyteczny, gdybym mógł używać zmiennych zamiast funkcji Select. Nie jestem jednak pewien, jak odnosić się do rzeczy (np. ActiveCell itp.) jeśli nie używasz Select.

Znalazłem Ten artykuł na temat zakresów i Ten przykład na temat korzyści z nie używania select ale nie mogę znaleźć nic na Jak ?

Author: Vityata, 2012-05-23

13 answers

Niektóre przykłady jak uniknąć select

Użyj Dim'zmienne d

Dim rng as Range

Set zmienną do wymaganego zakresu. Istnieje wiele sposobów odwoływania się do zakresu jednokomórkowego

Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")

Lub multi-cell range

Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)

Możesz użyć skrótu do metody Evaluate, ale jest to mniej efektywne i powinno się go unikać w kodzie produkcyjnym.

Set rng = [A1]
Set rng = [A1:B10]

Wszystkie powyższe przykłady odnoszą się do komórek na aktywnym arkuszu. Chyba że jeśli chcesz pracować tylko z aktywnym arkuszem, lepiej przyciemnić zmienną Worksheet

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
    Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With

Jeśli chcesz pracować z , dla jasności najlepiej jest być wyraźnym. Ale uważaj, ponieważ niektóre metody Worksheet zmieniają aktywny arkusz.

Set rng = ActiveSheet.Range("A1")

Ponownie odnosi się to do active workbook . Jeśli nie chcesz pracować tylko z ActiveWorkbook lub ThisWorkbook, lepiej przyciemnić zmienną Workbook.

Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")

Jeśli czy chcesz pracować z ActiveWorkbook, dla jasności najlepiej być wyraźnym. Ale uważaj, ponieważ wiele metod zmienia aktywną księgę.

Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")

Możesz również użyć obiektu ThisWorkbook, aby odnieść się do książki zawierającej uruchomiony kod.

Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")

Częstym (złym) fragmentem kodu jest otwarcie książki, pobranie danych, a następnie ponowne zamknięcie

To jest złe:

Sub foo()
    Dim v as Variant
    Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
    Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = ActiveWorkbook.Sheets(1).Range("A1").Value
    Workbooks("SomeAlreadyOpenBook.xlsx").Activate
    ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
    Workbooks(2).Activate
    ActiveWorkbook.Close()
End Sub

I byłoby lepiej jak:

SUb foo()
    Dim v as Variant
    Dim wb1 as Workbook
    Dim  wb2 as Workbook
    Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
    Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = wb2.Sheets("SomeSheet").Range("A1").Value
    wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
    wb2.Close()
End Sub

Prześlij zakresy do twojego Sub'S I Function' S jako zakres zmienne

Sub ClearRange(r as Range)
    r.ClearContents
    '....
End Sub

Sub MyMacro()
    Dim rng as Range
    Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
    ClearRange rng
End Sub

Należy również stosować metody (takie jak Find i Copy) do zmiennych

Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2

Jeśli zapętlasz zakres komórek, często lepiej (szybciej) jest najpierw skopiować wartości zakresu do tablicy wariantowej i zapętlać nad nią

Dim dat As Variant
Dim rng As Range
Dim i As Long

Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value  ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
    dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet
To mały degustator na to, co możliwe.
 427
Author: chris neilsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 23:16:57

Dwa główne powody, dla których .Select/.Activate/Selection/Activecell/Activesheet/Activeworkbook itd... należy unikać

    Spowalnia twój kod.
  1. jest zwykle główną przyczyną błędów w uruchomieniu.

Jak tego uniknąć?

1) bezpośrednio pracować z odpowiednimi obiektami

Rozważ ten kod

Sheets("Sheet1").Activate
Range("A1").Select
Selection.Value = "Blah"
Selection.NumberFormat = "@"

Ten kod można również zapisać jako

With Sheets("Sheet1").Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With

2) w razie potrzeby zadeklaruj swoje zmienne. Ten sam kod powyżej można zapisać jako

Dim ws as worksheet

Set ws = Sheets("Sheet1")

With ws.Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With
 173
Author: Siddharth Rout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 08:33:10

Jeden mały punkt podkreślenia dodam do wszystkich doskonałych odpowiedzi podanych powyżej:

Prawdopodobnie największą rzeczą, jaką możesz zrobić, aby uniknąć użycia Select, jest jak najwięcej, użyj nazwanych zakresów (w połączeniu ze znaczącymi nazwami zmiennych) w kodzie VBA. Ten punkt został wspomniany powyżej, ale nieco wyostrzony, jednak zasługuje na szczególną uwagę.

Oto kilka dodatkowych powodów, aby liberalnie używać nazwanych zakresów, chociaż jestem pewien, że mógłbym myśleć więcej.

Nazwane zakresy ułatwiają odczyt i zrozumienie kodu.

Przykład:

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")
'e.g, "Months" might be a named range referring to A1:A12

Set MonthlySales = Range("MonthlySales")
'e.g, "Monthly Sales" might be a named range referring to B1:B12

Dim Month As Range
For Each Month in Months
    Debug.Print MonthlySales(Month.Row)
Next Month

Jest dość oczywiste, co zawierają nazwane zakresy Months i MonthlySales i co robi procedura.

Dlaczego to jest ważne? Częściowo dlatego, że jest to łatwiejsze do zrozumienia dla innych ludzi, ale nawet jeśli jesteś jedyną osobą, która kiedykolwiek zobaczy lub użyje Twojego kodu, nadal powinieneś używać nazwanych zakresów i dobrych nazw zmiennych, ponieważ zapomnisz co zamierzałeś z nim zrobić rok później i zmarnujesz 30 minuty tylko zastanawiając się, co robi twój kod.

Nazwane zakresy zapewniają, że makra nie pękają kiedy(nie jeśli!) zmienia się konfiguracja arkusza kalkulacyjnego.

Rozważ, jeśli powyższy przykład został napisany w ten sposób:

Dim rng1 As Range
Dim rng2 As Range

Set rng1 = Range("A1:A12")
Set rng2 = Range("B1:B12")

Dim rng3 As Range
For Each rng3 in rng1 
    Debug.Print rng2(rng3.Row)
Next rng3

Ten kod będzie działał dobrze na początku - czyli dopóki ty lub przyszły użytkownik nie zdecyduje " gee wiz, myślę, że dodam nową kolumnę z rokiem w kolumnie A!", lub umieścić kolumnę wydatków między kolumnami miesięcy i sprzedaży, lub dodać nagłówek do każdej kolumny. Twój kod jest złamany. A ponieważ użyłeś strasznych nazw zmiennych, zajmie ci to o wiele więcej czasu, aby dowiedzieć się, jak to naprawić, niż powinno to zająć.

Jeśli na początku użyłeś nazwanych zakresów, Kolumny Months i Sales mogą być przesuwane do woli, a Twój kod będzie działał poprawnie.

 71
Author: Rick Teachey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-15 01:32:42

Dam krótką odpowiedź, ponieważ wszyscy inni Dali długą.

Dostaniesz .wybierz i .Aktywuj za każdym razem, gdy nagrywasz makra i używasz ich ponownie. Kiedy ty .wybierz komórkę lub arkusz, dzięki czemu jest on aktywny. Od tego momentu za każdym razem, gdy używasz niekwalifikowanych referencji, takich jak Range.Value, po prostu używają aktywnej komórki i arkusza. Może to być również problematyczne, jeśli nie oglądasz, gdzie znajduje się kod lub użytkownik kliknie skoroszyt.

Więc możesz wyeliminować te problemy poprzez bezpośrednio odsyła do twoich komórek. Co idzie:

'create and set a range
Dim Rng As Excel.Range
Set Rng = Workbooks("Book1").Worksheets("Sheet1").Range("A1")
'OR
Set Rng = Workbooks(1).Worksheets(1).Cells(1, 1)

Or you could

'Just deal with the cell directly rather than creating a range
'I want to put the string "Hello" in Range A1 of sheet 1
Workbooks("Book1").Worksheets("Sheet1").Range("A1").value = "Hello"
'OR
Workbooks(1).Worksheets(1).Cells(1, 1).value = "Hello"

Istnieją różne kombinacje tych metod, ale to byłaby ogólna idea wyrażona tak szybko, jak to możliwe dla niecierpliwych ludzi, takich jak ja.

 37
Author: MattB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 00:51:54

"... i odkrywam, że mój kod byłby bardziej nadający się do ponownego użycia, gdybym mógł używać zmiennych zamiast wybranych funkcji."

Chociaż nie mogę myśleć o niczym więcej niż o odosobnionej garści sytuacji, w których .Select byłoby lepszym Wyborem niż bezpośrednie odwoływanie się do komórek, chciałbym stanąć do obrony {[2] } i zwrócić uwagę, że nie powinno się go wyrzucać z tych samych powodów, których należy unikać.

Są chwile, kiedy mamy krótkie, oszczędzające czas makro sub procedury przypisane do kombinacji skrótów klawiszowych dostępnych za dotknięciem kilku klawiszy oszczędzają dużo czasu. Jest w stanie wybrać grupę komórek do wprowadzenia kodu operacyjnego na działa cuda, gdy mamy do czynienia z kieszonkowymi danymi, które nie są zgodne z formatem danych w całym arkuszu roboczym. W ten sam sposób, w jaki można wybrać grupę komórek i zastosować zmianę formatu, wybranie grupy komórek do uruchomienia specjalnego kodu makra może być główną oszczędnością czasu.

Przykłady podprogramów opartych na selekcji framework:

Public Sub Run_on_Selected()
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Selected_Visible()
    'this is better for selected ranges on filtered data or containing hidden rows/columns
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL.SpecialCells(xlCellTypeVisible)
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Discontiguous_Area()
    'this is better for selected ranges of discontiguous areas
    Dim ara As Range, rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each ara In rSEL.Areas
        Debug.Print ara.Address(0, 0)
        'cell group operational code here
        For Each rng In ara.Areas
            Debug.Print rng.Address(0, 0)
            'cell-by-cell operational code here
        Next rng
    Next ara
    Set rSEL = Nothing
End Sub

Rzeczywisty kod do przetworzenia może być dowolny, od pojedynczej linii do wielu modułów. Użyłem tej metody do zainicjowania długotrwałych procedur na poszarpanym zaznaczeniu komórek zawierających nazwy plików zewnętrznych skoroszytów.

Krótko mówiąc, nie odrzucaj Selection ze względu na jego ścisłe powiązanie z .Select i ActiveCell. Jako właściwość arkusza roboczego ma wiele innych celów.

(tak, Wiem, że to pytanie dotyczyło .Select, nie Selection ale chciałem usunąć wszelkie błędne przekonania, które początkujący Programiści VBA mogą wywnioskować.)

 28
Author: Jeeped,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 05:53:18

Proszę zauważyć, że poniżej porównuję podejście Select (to, którego OP chce uniknąć), z podejściem Range (i to jest odpowiedź na pytanie). Więc nie przestawaj czytać, gdy zobaczysz pierwsze zaznaczenie.

To naprawdę zależy od tego, co próbujesz zrobić. W każdym razie przydałby się prosty przykład. Załóżmy, że chcesz ustawić wartość aktywnej komórki na "foo". Używając ActiveCell napisałbyś coś takiego:
Sub Macro1()
    ActiveCell.Value = "foo"
End Sub

Jeśli chcesz użyć dla komórki, która nie jest aktywna, na przykład dla "B2", powinieneś najpierw ją wybrać, TAK:

Sub Macro2()
    Range("B2").Select
    Macro1
End Sub

Używając zakresów możesz napisać bardziej ogólne makro, które może być użyte do ustawienia wartości dowolnej komórki na dowolną:

Sub SetValue(cellAddress As String, aVal As Variant)
    Range(cellAddress).Value = aVal
End Sub

Następnie możesz przepisać Makro2 jako:

Sub Macro2()
    SetCellValue "B2", "foo"
End Sub

Oraz Macro1 jako:

Sub Macro1()
    SetValue ActiveCell.Address, "foo"
End Sub
Mam nadzieję, że to trochę wyjaśni.
 25
Author: Francesco Baruchelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 05:49:40

Unikanie Select i Activate to ruch, który sprawia, że jesteś nieco lepszym programistą VBA. Ogólnie rzecz biorąc, Select i Activate są używane, gdy makro jest rejestrowane, więc arkusz roboczy lub zakres Parent jest zawsze uważany za aktywny.

W ten sposób można uniknąć Select i Activate w następujących przypadkach:


Dodawanie nowego arkusza i kopiowanie komórki na nim:

From (kod wygenerowany z rejestratora makr):

Sub Makro2()
    Range("B2").Select
    Sheets.Add After:=ActiveSheet
    Sheets("Tabelle1").Select
    Sheets("Tabelle1").Name = "NewName"
    ActiveCell.FormulaR1C1 = "12"
    Range("B2").Select
    Selection.Copy
    Range("B3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

Do:

Sub TestMe()
    Dim ws As Worksheet
    Set ws = Worksheets.Add
    With ws
        .Name = "NewName"
        .Range("B2") = 12
        .Range("B2").Copy Destination:=.Range("B3")
    End With
End Sub

Kiedy chcesz aby skopiować zakres między arkuszami:

From:

Sheets("Source").Select
Columns("A:D").Select
Selection.Copy
Sheets("Target").Select
Columns("A:D").Select
ActiveSheet.Paste

Do:

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").Range("a1")

Użycie fantazyjnych nazw zakresów

Możesz uzyskać do nich dostęp za pomocą []. Co jest naprawdę piękne, w porównaniu do innego sposobu. Sprawdź się:

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")    
Set MonthlySales = Range("MonthlySales")

Set Months =[Months]
Set MonthlySales = [MonthlySales]

Przykład z góry wyglądałby tak:

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").[A1]

Nie kopiowanie wartości, ale ich przyjmowanie

Zazwyczaj, jeśli chcesz select, najprawdopodobniej coś kopiujesz. Jeśli interesuje Cię tylko wartości, jest to dobra opcja, aby uniknąć select:

Range("B1:B6").Value = Range("A1:A6").Value


Staraj się zawsze odwoływać się również do arkusza]}

Jest to prawdopodobnie najczęstszy błąd w vba . Za każdym razem, gdy kopiujesz zakresy, czasami arkusz roboczy nie jest odsyłany, a zatem VBA rozważa arkusz ActiveWorksheet.

'This will work only if the 2. Worksheet is selected!
Public Sub TestMe()
    Dim rng As Range
    Set rng = Worksheets(2).Range(Cells(1, 1), Cells(2, 2)).Copy
End Sub

'This works always!
Public Sub TestMe2()
    Dim rng As Range
    With Worksheets(2)
        .Range(.Cells(1, 1), .Cells(2, 2)).Copy
    End With
End Sub

Czy naprawdę mogę nigdy nie używać .Select lub .Activate do niczego?

Jedyny czas, kiedy możesz być uzasadniony do użycia .Activate i .Select jest wtedy, gdy chcesz upewnij się, że ze względów wizualnych wybrano konkretny arkusz roboczy. Na przykład, że Twój Excel zawsze otwierałby się z wybranym najpierw arkuszem okładki, pomijając, który był arkuszem aktywnym, gdy plik został zamknięty. Tak więc coś takiego jest absolutnie ok: {]}

Private Sub Workbook_Open()
    Worksheets("Cover").Activate
End Sub
 18
Author: Vityata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 14:39:08

Zawsze podawaj skoroszyt, arkusz roboczy I komórkę/zakres.

Na przykład:

Thisworkbook.Worksheets("fred").cells(1,1)
Workbooks("bob").Worksheets("fred").cells(1,1)

Ponieważ użytkownicy końcowi zawsze będą klikać przyciski i jak tylko fokus przesunie się ze skoroszytu, z którym KOD chce pracować, wtedy wszystko pójdzie zupełnie nie tak.

I nigdy nie używaj indeksu skoroszytu.

Workbooks(1).Worksheets("fred").cells(1,1)

Nie wiesz, jakie inne skoroszyty będą otwarte, gdy użytkownik uruchomi Twój kod.

 13
Author: user1644564,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-25 04:46:02

IMHO użycie .select pochodzi od ludzi, którzy tak jak ja zaczęli uczyć się VBA z konieczności poprzez nagrywanie makr, a następnie modyfikowanie kodu, nie zdając sobie sprawy, że .select i kolejne selection to tylko niepotrzebny średni-men.

.select można uniknąć, jak wielu już opublikowanych, bezpośrednio pracując z już istniejącymi obiektami, co pozwala na różne pośrednie odniesienia, takie jak obliczanie i I j w sposób złożony, a następnie edytowanie komórki (i,j), itp.

W Przeciwnym Razie, nie ma nic domyślnie źle z samym .select i możesz łatwo znaleźć do tego zastosowania, np. mam arkusz kalkulacyjny, który wypełniam datą, aktywuję makro, które robi z nim magię i eksportuje je w akceptowalnym formacie na oddzielnym arkuszu, który jednak wymaga ostatecznych ręcznych (nieprzewidywalnych) wejść do sąsiedniej komórki. Więc nadchodzi moment .select, który oszczędza mi dodatkowy ruch myszy i kliknięcie.

 5
Author: Eleshar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-08 05:10:25

Szybka Odpowiedź:

Aby uniknąć użycia metody .Select, możesz ustawić zmienną równą żądanej właściwości.

► na przykład, jeśli chcesz mieć wartość w Cell A1 możesz ustawić zmienną równą właściwości value tej komórki.

  • przykład valOne = Range("A1").Value

► na przykład, jeśli chcesz mieć nazwę kodową ' Sheet3`, możesz ustawić zmienną równą właściwości codename tego arkusza roboczego.

  • przykład valTwo = Sheets("Sheet3").Codename

Mam nadzieję, że pomaga. Daj znać, jeśli masz jakieś pytania.

 4
Author: FinPro.Online,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 06:36:33

W 1999 roku, w wyniku połączenia się z firmą, została ona założona w 1999 roku, a w 1999 roku została założona w 1999 roku.]}

Dlaczego nie zadzwonić .Activate, .Select, Selection, ActiveSomething metody / właściwości

W zasadzie dlatego, że są wywoływane przede wszystkim do obsługi wprowadzania danych przez interfejs aplikacji. Ponieważ są to metody wywoływane, gdy użytkownik obsługuje obiekty za pośrednictwem interfejsu użytkownika, są to metody zarejestrowane przez makro-rejestrator, dlatego wywołanie ich jest kruche lub zbędne w większości sytuacji: nie musisz wybierać obiektu, aby wykonać akcję z Selection zaraz po tym.

Definicja ta określa jednak sytuacje, do których są powoływane:

Kiedy zadzwonić .Activate, .Select, .Selection, .ActiveSomething metody / właściwości

Zasadniczo wtedy, gdy oczekujesz, że użytkownik końcowy odegra rolę w wykonaniu.

Jeśli rozwijasz i oczekujesz, że użytkownik wybierze instancje obiektów, dla których kod ma obsługiwać, to .Selection lub .ActiveObject są właściwe.

Z drugiej strony, .Select i .Activate są przydatne, gdy możesz wywnioskować następną akcję użytkownika i chcesz, aby Twój kod prowadził użytkownika, prawdopodobnie oszczędzając mu trochę czasu i kliknięć myszką. Na przykład, jeśli twój kod stworzył zupełnie nową instancję wykresu lub zaktualizowaną, użytkownik może chcieć to sprawdzić i możesz wywołać .Activate na nim lub jego arkuszu, aby zaoszczędzić użytkownikowi czas na szukanie go; lub jeśli wiesz, że użytkownik będzie musiał zaktualizować niektóre wartości zakresu, możesz programowo wybierz ten zakres.

 3
Author: LFB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 15:53:45

Jest to przykład, który wyczyści zawartość komórki " A1 " (lub więcej, jeśli typem wyboru jest xllastcell, itd.). Wszystko odbywa się bez konieczności wybierania komórek.

Application.GoTo Reference:=Workbook(WorkbookName).Worksheets(WorksheetName).Range("A1")
Range(Selection,selection(selectiontype)).clearcontents 
Mam nadzieję, że to komuś pomoże.
 1
Author: marionffavp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 05:54:31

Zauważyłem, że żadna z tych odpowiedzi nie wspomina .Właściwość Offset . Można to również wykorzystać, aby uniknąć użycia działania Select podczas manipulowania niektórymi komórkami, szczególnie w odniesieniu do wybranej komórki(jak wspomina op z ActiveCell).

Oto kilka przykładów.

Zakładam również, że "ActiveCell" to J4 .

ActiveCell.Offset(2, 0).Value = 12

  • to zmieni komórkę J6 na wartość 12
  • minus -2 wskazywałby na J2

ActiveCell.Offset(0,1).Copy ActiveCell.Offset(,2)

  • to skopiuje komórkę z k4 do L4.
  • zauważ, że "0" nie jest potrzebne w parametrze offset, jeśli nie jest potrzebne (, 2)
  • podobnie jak w poprzednim przykładzie A minus 1 będzie i4

ActiveCell.Offset(, -1).EntireColumn.ClearContents

  • spowoduje wyczyszczenie wartości we wszystkich komórkach w kolumnie K.

To nie znaczy, że są "lepsze" niż powyższe opcje, ale po prostu wymieniając alternatywy.

 0
Author: PGCodeRider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 20:07:44