Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - Kopiowanie zawartości komórki wraz z komentarzem

janoazs 10 Aug 2013 17:55 8202 14
  • #1
    janoazs
    Level 2  
    Witam,
    mam problem z ustawieniem automatycznego kopiowania zawartości komórki jednego arkusza do innego arkusza

    tzn. przenosi mi jej zawartość ale bez komentarza który mam tam dodany

    w komórce A1 w arkuszu2 arkusz2 użyłem funkcji: ='arkusz1'!A1
    kopiuje mi bardzo ładnie całą zawartość ale niestety bez komentarz
    proszę o pomoc
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #2
    marcinj12
    Level 40  
    Nie ma na to prostego sposobu, a takie zwykłe przypisanie wartości formułą nie można nazwać kopiowaniem.

    Możesz napisać makro, które będzie kopiowało komentarze z jednego zakresu do drugiego np. po kliknięciu przycisku.

    Możesz napisać funkcję użytkownika, która w wyniku zwróci wartość komentarza z podanej komórki.

    Możesz też - i to chyba najbliższe jest temu, co chcesz osiągnąć - napisać funkcję użytkownika, która przyjmuje dwa parametry: komórkę źródłową oraz docelową.
    Może ona wyglądać tak:
    Code: vb
    Log in, to see the code

    Funkcja przyjmuje da parametry - pierwszy to komórka źródłowa (do przekopiwania), drugi - komórka docelowa, czyli komórka, w której jest ta formuła. Tworzy to takie jakby odwołanie cykliczne, ale w tym wypadku to nie przeszkadza.

    Niestety, dodanie lub modyfikacja komentarz nie wywołuje żadnego zdarzenia które można obsłużyć, więc funkcja tak naprawdę kopiuje wartość oraz komentarz tylko w momencie przeliczenia. Inaczej mówiąc - samo wstawienie komentarza nie spowoduje jego przekopiowania, do tego musi się zmienić wartość komórki. Dodałem Application.Volatile, aby to przeliczanie następowało częściej - również przy zmianie wartości w innej komórce. Oprócz tego funkcja przelicza się w momencie otwarcia arkusza.

    Jeśli komentarz jest istotną częścią danych, to może lepiej zamiast komentarza w komórce wstawić na niego dodatkową kolumnę i ją kopiować??
  • #3
    janoazs
    Level 2  
    kurczę, widzę że trafiłem na prawdziwego wirtuoza ;-)
    Dzięki za szybką odpowiedź, faktycznie taka funkcja powinna spełnić moje oczekiwanie.

    Mam 2 pytania:
    1. jaki sposób mam dodać funkcję którą dla mnie stworzyłeś?
    2. czy funkcja będzie się tyczyć wszystkich komórek w dokumencie czy tylko tych do których zostanie dodana?
  • #4
    marcinj12
    Level 40  
    janoazs wrote:
    1. jaki sposób mam dodać funkcję którą dla mnie stworzyłeś?
    Plik musisz zapisać z rozszerzeniem .xlsm. Potem wchodzisz przez ALT+F11 w edytor VBA, w "katalogu" Modules w okienku po lewej stronie klikasz prawym, Insert->Module i tam wklejasz tą funkcję. Zapisujesz i teraz możesz w Excelu użyć jej jak zwykłej funkcji - znajdziesz ją w kategorii funkcji użytkownika, albo podpowie się jak zaczniesz pisać jej nazwę.
    O tworzeniu funkcji użytkownika w Excelu jest dużo materiałów i kursów na sieci, jak Cię to interesuje, możesz sobie wyszukać i się zapoznać.

    janoazs wrote:
    2. czy funkcja będzie się tyczyć wszystkich komórek w dokumencie czy tylko tych do których zostanie dodana?
    Ta konkretna funkcja działa dla pojedynczej komórki (źródłowej i docelowej) - podajesz jaką komórkę ma skopiować i gdzie,potem możesz ją przeciągnąć jak każdą funkcję w Excelu.
  • #5
    janoazs
    Level 2  
    baardzo Ci dziękuję.
    Funkcja w formie którą mi napisałeś wystarcza dla moich potrzeb w zupełności. Rewelacja.
    Tworzenie funkcji i generalnie zabawa excel'em coraz bardziej mnie interesują bo widzę że możliwości tego programu są chyba nieograniczone.
    Niestety z tego co zauważyłem to mam duże braki i część zagadnień jest na chwilę obecną całkowicie poza moim zasięgiem.
    Czy jesteś w stanie polecić jakiś dobry kurs Excela on-line?
    pozdrawiam
  • #6
    Maciej Gonet
    VBA, Excel specialist
    Dzień dobry,
    Funkcję zaproponowaną przez Kolegę marcinaj12 można nieco uprościć, tak aby przy wywołaniu nie trzeba było podawać adresu komórki docelowej. Zamiast tego można wykorzystać właściwość ThisCell obiektu Application. Początek funkcji mógłby wyglądać następująco:
    Function KopiujZKomentarzem(src As Range) As Variant
    Dim dest As Range
    Set dest = Application.ThisCell

    dalej może pozostać bez zmian.
  • #7
    marcinj12
    Level 40  
    Maciej Gonet wrote:
    Zamiast tego można wykorzystać właściwość ThisCell obiektu Application
    Słuszna uwaga. Brakowało mi tej właściwości :)
  • #8
    zbs69
    Level 1  
    Probowałęm opcje pierwsza i opcje drugą w libreoffice i wywala mi błąd, proszę o pomoc.

    pierwsza funkcja
    Function KopiujZKomentarzem(src As Range) As Variant
    Dim dest As Range
    Set dest = Application.ThisCell
    If Not src.Comment Is Nothing Then
    If dest.Comment Is Nothing Then
    dest.AddComment
    End If
    dest.Comment.Text Text:=src.Comment.Text
    KopiujZKomentarzem = src.Value
    Else
    If Not dest.Comment Is Nothing Then
    dest.Comment.Delete
    End If
    KopiujZKomentarzem = src.Value
    End If
    End Function


    Druga funkcja

    Function KopiujZKomentarzem(src As Range, dest As Range) As Variant
    Application.Volatile
    If Not src.Comment Is Nothing Then
    If dest.Comment Is Nothing Then
    dest.AddComment
    End If
    dest.Comment.Text Text:=src.Comment.Text
    KopiujZKomentarzem = src.Value
    Else
    If Not dest.Comment Is Nothing Then
    dest.Comment.Delete
    End If
    KopiujZKomentarzem = src.Value
    End If
    End Function

    mam błąd odnosnie języka składni, libreoffice 5 pomocy!!!
  • #10
    szyman777
    Level 8  
    marcinj12 wrote:
    Maciej Gonet wrote:
    Zamiast tego można wykorzystać właściwość ThisCell obiektu Application
    Słuszna uwaga. Brakowało mi tej właściwości :)

    Witam.
    Zastosowałem tą funkcję w swoim pliku, działa dobrze do pierwszego przeliczenia (np F2) i wyrzuca błąd wartości. Excel 2013.
  • #11
    Maciej Gonet
    VBA, Excel specialist
    Załącz przykładowy plik z dokładnym opisem, co chcesz robić, użytą funkcją i z opisem błędu, który występuje oraz okoliczności jego wystąpienia.
  • #12
    szyman777
    Level 8  
    Maciej Gonet wrote:
    Załącz przykładowy plik z dokładnym opisem, co chcesz robić, użytą funkcją i z opisem błędu, który występuje oraz okoliczności jego wystąpienia.

    Witam.
    W załączniku przykładowe pliki, niestety nie mogłem dodac pliku z rozszerzeniem xlsm.
    W pliku Zeszyt2 mająbyć kopiowane komórki z komentarzami przy użyciu wyżej wymienionej funkcji. Wszystko jest ok przy pierwszym wpisaniu funkcji i zaciągnięciu danych. Natomiast przy próbie przeliczenia danych lub po zapisaniu i otwarciu ponownym pliku wystepuje bląd typu danych. Natomiast komentarze kopiują się prawidłowo.
  • #13
    Maciej Gonet
    VBA, Excel specialist
    Nie bardzo rozumiem problem, bo piszesz nieprecyzyjnie.
    Moim zdaniem wszystko działa prawidłowo. Jeśli chcesz kopiować z innego pliku, oba pliki muszą być otwarte w tej samej instancji Excela. Nie można odwoływać się do danych w zamkniętym pliku. Błąd #ARG! występuje, gdy dane z drugiego pliku są niedostępne. Czy to jest ten błąd typu danych, o którym piszesz? Piszesz o próbie przeliczenia danych, ale nie wiem w jaki sposób i w jakich okolicznościach?
    PS. Jeśli nie można dodać pliku o rozszerzeniu .xlsm, to zawsze można dodać plik .xls.
  • #14
    szyman777
    Level 8  
    Maciej Gonet wrote:
    ...Jeśli chcesz kopiować z innego pliku, oba pliki muszą być otwarte w tej samej instancji Excela...

    Dokładnie o to chodzi, nie pomyślałem o tym. Nie ma sposobu aby pobrać dane z zamkniętego pliku w innej lokalizacji?
    Jeśli chodzi o przeliczanie to odbywa się w momencie otwarcia pliku lub pojedyńczej komórki naciskając F2.
  • #15
    Maciej Gonet
    VBA, Excel specialist
    Pobieranie danych z zamkniętego skoroszytu jest możliwe, ale jest to programistycznie skomplikowane, powolne i podatne na błędy. Zwykle prościej jest plik otworzyć, pobrać co potrzeba i zamknąć. Wynik jest wtedy w formie stałych. Trzeba znać szczegóły problemu: ile jest danych do pobrania, z ilu plików, czy lokalizacja tych plików jest stała, jak często trzeba to odświeżać itp.