Aktywne Wpisy
pearl_jamik +120
Niech ktoś wytłumaczy dlaczego ludzie z wyższym wykształceniem, elita narodu, z wysokim ego, programiści stopnia najwyższego zostawiają po sobie w kiblu w biurze obesrany kibel?
#pracbaza #praca #pytanie #pytaniedoeksperta #programista15k
#pracbaza #praca #pytanie #pytaniedoeksperta #programista15k
#psy Mirki, jaką rasę psa doradźcie na pierwszego psa? Planuje wziąć na wiosnę ale już nie wiem. Myślałam o dalmatyńczyku, ale jest mało hodowli. Potem wymyśliłam białego owczarka szwajcarskiego, niby spoko jak na 1 psa, wszyscy mówili, a spotkałam się z panią co takiego ma na spacer, i trochę mnie zniechęciła (w sumie to dobrze, że nie słodziła tylko). Teraz mi chodzi po głowie chyba trochę mniejszy pies, zastanawiam się nad owczarkiem
Private Sub Worksheet_Calculate()
'Updateby Extendoffice
Dim Xrg As Range
Set Xrg = Range("C2:C8")
If Not Intersect(Xrg, Range("C2:C8")) Is Nothing Then
Macro1
End If
End Sub
Nie jestem informatykiem i dopiero poznaje zasady działania makr w excelu dlatego prosiłbym łopatologicznie. Czy da się temu jakoś zaradzić?
I jeszcze jedno. Chciałbym przypisać niektóre makra do przycisków. Przypisuje je, po czym kiedy zmienie nazwe pliku na którym pracuje, makro przestaje działać. Wywala błąd z którego wynika, że makro to odnosi się do starej nazwy pliku, chociaż w samym kodzie nie ma żadnych odniesień do nazw plików. To samo dzieje się kiedy przypisze makro do wstążki.
Czy jedynym rozwiązaniem jest ustawienie danego makra, jako makra osobistego?
#programowanie
#excel
Macro1
To przestanie zwracać błąd, konkretniejsza wskazówka wymaga:
- pokazania co zawiera Macro1
- podania jaki to błąd i która linia kodu go powoduje - co zwykle jest doskonale widoczne w momencie wystąpienia błędu
If Not Intersect(Xrg, Range("C2:C8")) Is Nothing Then
- ta linia kodu biorąc pod uwagę poprzednią jest kompletnie bez sensu - możesz bez zmiany działania zastąpić to:
Private Sub Worksheet_Calculate()
Macro1
End Sub
Nadal wiadomo, że problem jest w Macro1, być może powoduje nieskończone wywoływanie
Worksheet_Calculate
i może pomóc dodanie:Application.EnableEvents = False
Na początku, ale to wszystko zgadywanka.
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
Dim Xrg As Range
Set Xrg = Range("B3:B100")
If Not Intersect(Xrg, Range("B3:B100")) Is Nothing Then
Range("C3:E100").Select
ActiveWorkbook.Worksheets("Pomocnicza").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Pomocnicza").Sort.SortFields.Add Key:=Range( _
"C3:C100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Pomocnicza").Sort.SortFields.Add Key:=Range( _
"D3:D100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Pomocnicza").Sort
.SetRange Range("C2:E100")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B3").Select
ActiveCell.FormulaR1C1 = "=IF(OR(RC[1]="""",RC[2]=""""),"""",RC[1]&RC[2])"
Selection.Copy
ActiveCell.Offset(0, 1).Range("A1").Select
@Dakkar: OK, to już zawęża możliwości. Błąd ten zazwyczaj spowodowany jest, gdy polecenie typu:
Range("B3").Select
Odnosi się do skoroszytu, który w danej chwili nie jest aktywny. Widzę tylko sam kod, więc mogę tylko zgadywać:
- kod jest umieszczony w module arkusza o nazwie Pomocnicza
- zatem każde polecenie typu
Range("B3").Select
odnosi się właśnie do tego arkusza- jeśli zdarzenie Calculate arkusza Pomocnicza zostanie
Dzięki. Ten przykład z powyżej wygląda na sensowny ale jak widzisz w samym kodzie dość często przewija się funkcja select i chyba dość trudno będzie mi się jej pozbyć.
Czy to powinno wyglądać tak?
Range("C3:E100").Worksheets("Pomocnicza").Sort.SortFields.Clear
Zamiast:
Range("C3:E100").Select
ActiveWorkbook.Worksheets("Pomocnicza").Sort.SortFields.Clear
Nie bardzo wiem też jak poradzić sobie z tą częścią:
Selection.Copy
ActiveCell.Offset(0, 1).Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Selection.End(xlUp).Select
Selection.Copy
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Range("C3:E100").Worksheets("Pomocnicza").Sort.SortFields.Clear
Niestety nie...
ActiveWorkbook.Worksheets("Pomocnicza").Sort.SortFields.Clear
Nie wymaga zmiany - prawie.
ActiveWorkbook
lepiej zastąpićThisWorkbook
, czyli ten skoroszyt, w którym znajduje się kod VBA, a nie ten, który jest aktywny.Polecenie
Range("C3:E100").Select
nie jest tam w ogóle do niczego potrzebne i można je spokojnie usunąć, bo kolejne polecenie dodające pole sortowania zawiera adres.Selection.Copy
Zastąpisz
Range("B3").Copy
(B3 nadal jest aktywną komórką).
1*) To:
ActiveCell.Offset(0, 1).Range("A1").Select
Selection.End(xlDown).Select
Range("B3").Select
ActiveCell.FormulaR1C1 = "=IF(OR(RC[1]="""",RC[2]=""""),"""",RC[1]&RC[2])"
Selection.Copy
ActiveCell.Offset(0, 1).Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Selection.End(xlUp).Select
Selection.Copy
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
@Dakkar: moim zdaniem to co wyżej, jest równoznaczne z:
Set Xrg = Range("C3").End(xlDown).Offset(0, -1)
Range(Range("B3"), Xrg).FormulaR1C1 = "=IF(OR(RC[1]="""",RC[2]=""""),"""",RC[1]&RC[2])"
Range(Xrg.Offset(1, 0), Xrg.Offset(1, 0).End(xlDown)).ClearContents
Dalej jest Calculate i kolejny zbędny Select. Jak napisałem wyżej - to tylko zgadywanie.
Wszystko te warunki musiały być spełnione, żeby zastosować trick
Pobrałem plik, co prawda jest komunikat, że jest uszkodzony, ale chyba nic ważnego nie zginęło. Na pewno:
Set Xrg = Range("B3:B100")
If Not Intersect(Xrg, Range("B3:B100")) Is Nothing Then
I
End if
Są niepotrzebne. Moim zdaniem całość niepotrzebnie jest w zdarzeniu
Calculate
zamiastChange
Intersect(zakres1, zakres2) zwraca zakres będący częścią wspólną zakresów zakres1 i zakres2
- jeśli zakres "B3:B100" ma wspólne komórki z "B3:B100" to wykonaj następne polecenia
Moim zdaniem teraz jest niewygodne, w zdarzeniu Change powinno działać lepiej, tylko wtedy trzeba testować, czy zmiana dotyczy kolumn C:D
Znowu zgadywanki, bo nie wiadomo:
- czy kryteria filtrowania wybiera użytkownik, czy są stałe
- ile jest danych