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: 69266 Skopiuj do schowka 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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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
Kod:
Type:=8
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 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