ID tematu: 69266
 |
widok danych w serii |
Autor |
Wiadomość |
markustal
Exceloholic

Pomógł: 1 raz Posty: 151
|
Wysłany: 16-11-2020, 22:59
|
|
|
Dziękuję Macieju, jak zawsze można na Ciebie liczyć.
Zaczynam się trochę wgryzać w kod żeby chociaż trochę zrozumieć o co chodzi. Mam takie pytania. Przy nagrywaniu zastanawiałem się jak umieścić obiekt czyli tutaj wykres w konkretnej komórce bo przy nagrywaniu wstawiał w środek (chyba ma jakiś adres domyślny przy wstawianiu wykresów). Ty rozwiązałeś to linijką:
Kod: | ActiveSheet.Shapes.AddChart(xlColumnClustered, _
Left:=Range("A19").Left, Top:=Range("A19").Top).Select |
Pytanie. Czy można określić miejsce wstawiania na początku? Kombinowałem jakoś tak, ale nie działa.
Kod: | Sheets("Arkusz2").Select
Range("a2").Select
activeRange.Shapes.AddChart(xlColumnClustered).Select |
oraz Kod: | Sheets("Arkusz2").Select
Range("a2").Select
Selection.Shapes.AddChart(xlColumnClustered).Select | też nie działa.
Następnie dlaczego Kod: | .SeriesCollection(1).Delete | nie można zastąpić Kod: | .SeriesCollection(1)=False |
Następnie, linijka kodu Kod: | ' .ChartTitle.Characters.Font.Bold = True | jest w formie opisu. Tzn, że w layout 3 czcionka już jest pogrubiona i nie musimy wpisywać ją w kod?
I ostatnie pytanie. W kodzie Kod: | With .Range("c2", .UsedRange.SpecialCells(xlCellTypeLastCell)) | jest określona ostatnia komórka do formatowania. Czy istnieje kod do określenia pierwszej wypełnionej komórki? Coś w stylu Kod: | With .Range(.UsedRange.SpecialCells(xlCellTypeFirstCell, .UsedRange.SpecialCells(xlCellTypeLastCell)) | .
Wiem, że niektóre pytania są trywialne, ale będę wdzięczny za odpowiedzi. |
_________________ mm |
|
 | ID posta:
395110
|
|
|
 |
|
|
|
markustal
Exceloholic

Pomógł: 1 raz Posty: 151
|
Wysłany: 16-11-2020, 23:30
|
|
|
Jeszcze jedno, chociaż nie wiem czy nie za dużo jak na jeden raz.
Chciałem wstawić jeszcze warunek że jeśli ktoś zaznaczy inną kolumnę niż C oraz mniej niż dwa wiersze to pokaże się msgbox
Wymyśliłem coś takiego, ale nie wiem co jest nie tak
Kod: | If Selection.Column <> Range("C:C") Or Range("C" & Rows.Count).End(xlUp).Row < 2 Then MsgBox "Zaznacz dane w kolumnie C"
End If |
Pokazuje info że End if without block if, ale nie wiem co to znaczy
Pozdrawiam |
_________________ mm |
|
 | ID posta:
395111
|
|
|
 |
|
|
Maciej Gonet
Excel Expert

Wersja: Win Office 2016
Pomógł: 2033 razy Posty: 6431
|
Wysłany: 17-11-2020, 07:20
|
|
|
Zacznę od ostatniego pytania, bo mam teraz ograniczony czas.
Tu jest kilka błędów.
Jeśli po Then jest polecenie w jednej linii logicznej z If, to jest to instrukcja jednowierszowa i End If jest wtedy niepotrzebne.
Jeśli po Then przechodzimy do nowej linii, wtedy całą instrukcję kończymy End If w osobnym wierszu.
Zamiast
Kod: | Selection.Column <> Range("C:C") | możesz użyć np.
Kod: | Selection.Column <> 3 | albo jeśli obawiasz się, że wybrany zostanie zakres wielokolumnowy, to
Kod: | Selection.Column <> 3 Or Selection.Columns.Count > 1 |
Zamiast
Kod: | Range("C" & Rows.Count).End(xlUp).Row < 2 | można ewentualnie dać
Kod: | Selection.Rows.Count < 2 | chyba, że dodatkowo zależy ci, żeby zaznaczenie zaczynało się w pierwszym wierszu (o czym nie pisałeś). Poza tym Twój kod (ten fragment) nie odwołuje się do zaznaczenia tylko do danych, które w ogóle są w kolumnie C. Nie wiem więc, o co dokładnie Ci chodzi.
Teraz mam chwilę, żeby jeszcze odnieść się do wcześniejszych pytań.
Nie wiem czy dobrze zrozumiałem o co chodzi z tym określeniem miejsca wstawiania wykresu "na początku". "Na początku" czego? Nie można do tego użyć selekcji, bo to tak nie działa. Metoda AddChart ma parametry, których wartości określają położenie i rozmiary wykresu. Jak się tych parametrów nie poda, program przyjmie wartości domyślne. Ja założyłem, że wielkość wykresu będzie domyślna, a lewy górny róg określony na podstawie położenia komórek, które były użyte w Twoim kodzie. Inaczej się nie da. Oczywiście można sobie wcześniej wyliczyć te parametry jako zmienne, a później ich użyć.
Można też użyć obiektu zakresu i potem się do niego odwoływać, np. tak:
Kod: | Set pocz = Range("A2")
ActiveSheet.Shapes.AddChart(xlColumnClustered, pocz.Left, pocz.Top).Select | Ale to prawie to samo. Nie wiem o jaki efekt Ci chodziło.
SeriesCollection(1) jest obiektem, a nie właściwością, więc nie można mu przypisać wartości False, można do niego użyć odpowiedniej metody.
Ta instrukcja, którą zakomentowałem jest niepotrzebna, bo domyślnie tytuł jest pisany Boldem.
Kodu do znajdowania pierwszej wypełnionej komórki nie ma, trzeba to robić naokoło. Ten do znajdowania ostatniej też nie jest w pełni wiarygodny. |
|
 | ID posta:
395114
|
|
|
 |
|
|
markustal
Exceloholic

Pomógł: 1 raz Posty: 151
|
Wysłany: 18-11-2020, 14:33
|
|
|
Dziękuję pięknie, większość zrozumiałem i przyjąłem.
Jednak nadal nurtuje mnie takie coś...
Wstawiając wykres w arkusz uaktywniam arkusz i wstawiam wykres tymże sposobem:
Kod: | ActiveSheet.Shapes.AddChart(xlColumnClustered).Select |
Wtedy wykres jest wstawiany domyślnie z domyślnymi właściwościami.
A co jeśli chcę uaktywnić arkusz w nim uaktywnić komórkę i tam wstawić cały wykres (nie wiem czy wtedy wykres dostosowałby się do wielkości komórki czy komórka do wykresu, ale chodzi teoretycznie)
Czy w takim wypadku to nie powinno działać?:
Kod: | Sheets("Arkusz2").Select
Range("a2").Select
activeRange.Shapes.AddChart(xlColumnClustered).Select |
jeśli nie to co jest nie tak?
Mam problem jeszcze z moim rozwiązaniem z msgbox. Jeśli wstawię twoje proponowane komendy jest ok. Ale napisałeś, że zamiast mojej Selection.Column <> Range("C:C") mogę Selection.Column <> 3. Ale gdy robię z moją komendą to jest błąd. Więc jednak range ("C:C") jest niewłaściwe tutaj?
I ostatnio prośba mam nadzieję. Jak przerwać makro (bo pokazuje msgbox, ale dalej tworzy wykres, ale tego wtedy już nie chcę) jeśli któryś z tych warunków jest spełniony?
Pozdrawiam
makrowykres2.xlsm
|
Pobierz Plik ściągnięto 5 raz(y) 26.02 KB |
|
_________________ mm |
|
 | ID posta:
395195
|
|
|
 |
|
|
Maciej Gonet
Excel Expert

Wersja: Win Office 2016
Pomógł: 2033 razy Posty: 6431
|
Wysłany: 18-11-2020, 15:43
|
|
|
markustal napisał/a: | A co jeśli chcę uaktywnić arkusz w nim uaktywnić komórkę i tam wstawić cały wykres (nie wiem czy wtedy wykres dostosowałby się do wielkości komórki czy komórka do wykresu, ale chodzi teoretycznie) | Nic się nie dopasowuje automatycznie. Selekcja zakresu nie jest powiązana z położeniem dodawanego wykresu. Nie bardzo rozumiem, czy chcesz mieć bardzo dużą komórkę, a w niej wykres, czy normalną komórkę, a w niej maleńki wykresik?
Zakładam, że raczej to pierwsze, ale nie rozumiem po co. Co Ci szkodzi, że wykres jest na tle wielu komórek? Pamiętaj, że nie da się powiększyć pojedynczej komórki (chyba, że przez scalanie), tylko powiększasz cały wiersz i całą kolumnę.
Można to ewentualnie zrobić tak:
Kod: | With Range("A2")
.ColumnWidth = 50
.RowHeight = 200
ActiveSheet.Shapes.AddChart(xlColumnClustered, .Left, .Top, .Width, .Height).Select
End With | Powiększając kolumnę trzeba uważać, bo jej szerokość podaje się w znakach, a nie w punktach.
Wyrażenie
Kod: | Selection.Column <> Range("C:C") | jest błędne, bo porównujesz liczbę (nr kolumny) z obiektem. Jeśli Ci tak zależy, żeby było jawnie C, to napisz:
Kod: | Selection.Column <> Range("C:C").Column | albo
Kod: | Selection.Column <> Columns("C").Column |
Po MsgBox trzeba dać Exit Sub, ewentualnie zamknąć to w pętli, żeby użytkownik mógł zmienić zaznaczenie.
makrowykres2a.xlsm
|
Pobierz Plik ściągnięto 14 raz(y) 33.38 KB |
|
|
 | ID posta:
395201
|
|
|
 |
|
|
markustal
Exceloholic

Pomógł: 1 raz Posty: 151
|
Wysłany: 20-11-2020, 11:35
|
|
|
No i właśnie tego chciałem się dowiedzieć (czyli kluczem jest tutaj WITH).
Na postawie wstawiania wykresu do jednej komórki przerobiłem na wstawianie wykresu do wybranych. Ale działa tylko wtedy jeśli wybierzemy najpierw zakres w drugim arkuszy, wrócimy do pierwszego i uruchomimy makro (oczywiście po zaznaczeniu kolumny C)
Tak się zastanawiałem jeszcze. Gdybym chciał wstawić w wybrane komórki wykres ale w tym samym arkuszu to czy istnieje możliwość wybrania źródła ze schowka. Bo najpierw musiałbym skopiować dane w kolumnie C do schowka, zaznaczyć zakres do wstawiania w tym samym arkuszu i dopiero uruchomić makro.
Jak wygląda kod do pobierania informacji - tutaj zakresu danych ze schowka.
To już tak poza problemem, w celu rozszerzenia swojej wiedzy.
Za rozwiązanie problemu dziękuję Macieju jeszcze raz.
Aha. Czumu należy dać exit Sub a nie End sub?
Dołączam plik żeby było wiadomo o co chodzi.
Pozdrawiam
wykresy.xlsm
|
Pobierz Plik ściągnięto 9 raz(y) 20.46 KB |
|
_________________ mm |
|
 | ID posta:
395303
|
|
|
 |
|
|
Maciej Gonet
Excel Expert

Wersja: Win Office 2016
Pomógł: 2033 razy Posty: 6431
|
Wysłany: 20-11-2020, 13:37
|
|
|
Zacznę od końca.
markustal napisał/a: | Czumu należy dać exit Sub a nie End sub? | End Sub daje się tylko raz na końcu kodu procedury. Dalej kompilator już nic nie czyta (w ramach danej procedury Sub). Exit Sub może wystąpić wielokrotnie wewnątrz kodu i oznacza tylko przerwanie wykonywania kodu w danym przebiegu, a nie koniec kodu w ogóle.
markustal napisał/a: | czy istnieje możliwość wybrania źródła ze schowka | Istnieje taka możliwość, ale jest to trochę kłopotliwe odkąd są systemy 64-bitowe. Nie zawsze kopiowanie do schowka przebiega poprawnie. Była kiedyś dyskusja na ten temat.
Jeśli chodzi o wskazanie dwóch zakresów w tym samym arkuszu, to są dwa inne rozwiązania.
Pierwsze: selekcja może być zakresem złożonym z dwóch obszarów. Zaznaczamy pierwszy obszar, wciskamy klawisz Ctrl i zaznaczamy drugi obszar. Oczywiście wymaga to trochę uwagi ze strony użytkownika. Potem w kodzie odwołujemy się do Kod: | Selection.Areas(1) i Selection.Areas(2) | - w kolejności zaznaczania.
Inny sposób to odpytanie użytkownika już po uruchomieniu kodu przez metodę Kod: | Application.InputBox | Jeśli zadeklaruje się typ wyniku jako użytkownik może wskazać obszar myszką w odpowiedzi na pytanie. Wtedy jeden z obszarów możemy wskazać przed uruchomieniem makra, a drugi po uruchomieniu lub oba w trakcie trwania procedury - jak komu wygodniej. |
|
 | ID posta:
395313
|
|
|
 |
|
|
|
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
|
 |
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
|