Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[excel,vba] funkcja kopiuj

-Tomi- 03 Sie 2010 10:53 7095 14
  • #1 03 Sie 2010 10:53
    -Tomi-
    Poziom 13  

    Witam!

    Mam taki problem. Potrzebuję stworzyć funkcję kopiuj która będzie dostępna w funkcjach użytkownika a ma ona działać tak samo jak opcja kopiuj wklej. Nie wiem jak napisać taki kod w vba. Proszę o pomoc.

    0 14
  • #2 03 Sie 2010 13:42
    walek33
    Poziom 28  

    Myślę, że będzie to wyzwanie (raczej) niewykonalne. Możesz stworzyć procedurkę uruchamianą z jakiegoś przycisku lub z menu "Makro". Chcesz kopiować jakiś stały fragment arkusza?

    0
  • #3 03 Sie 2010 13:49
    marcinj12
    Poziom 40  

    A co konkretnie ta funkcja ma kopiować? Tekst? Do tego wystarczy formuła. Formaty komórek? Obrazki?

    0
  • #4 03 Sie 2010 14:01
    walek33
    Poziom 28  

    :arrow: marcinj12
    Cokolwiek nie miało by to być, myślisz, że da się umieścić w funkcjach użytkownika?

    0
  • #5 03 Sie 2010 14:17
    marcinj12
    Poziom 40  

    Myślę że się da :) Funkcja użytkownika może wykonywać dowolny kod VBA, zrób sobie taką funkcję i zobaczysz że działa:

    Code:

    Public Function myFunc()
       MsgBox "test"
    End Function


    Może się łączyć z bazą danych, pokazywać formę, usuwać pliki z dysku ;) czy co sobie zażyczysz...

    Pytanie po co robić coś takiego jako funkcję, nie makro uruchamiane np. przyciskiem??

    0
  • #6 03 Sie 2010 14:41
    walek33
    Poziom 28  

    A próbowałeś kopiowania i wklejania w taki sposób? :cry: Twoja funkcja oczywiście działa, ale... Moim skromnym zdaniem funkcja powinna zwrócić wynik jakiegoś mniej lub bardziej skomplikowanego obliczenia np. nie chwaląc się :D coś takiego?
    Na koniec całkowicie się z Tobą zgadzam.

    Cytat:
    Pytanie po co robić coś takiego jako funkcję, nie makro uruchamiane np. przyciskiem??

    0
  • #7 03 Sie 2010 15:59
    marcinj12
    Poziom 40  

    walek33, przyznaję masz rację... Byłem przekonany aż do dzisiaj, że w funkcji użytkownika można umieścić dowolny kod, taki sam jak w procedurze... Ale faktycznie - jeżeli kod w funkcji próbuje coś modyfikować z arkuszem, to nic nie daje... Dziwne, pewnie jakieś zabezpieczenie MS przed "złośliwym" kodem który można by zaszyć w funkcji...

    0
  • #8 03 Sie 2010 16:01
    -Tomi-
    Poziom 13  

    Chłopaki funkcja ma kopiować text który jest w komórce jak i format tej komórki innymi słowy ma zastąpić proste polecenie kopiuj daną komórkę wklej daną komórkę. Chodzi mi dlatego o to bo jeśli zastosuję coś takiego

    Code:
    fx=B4
    to owszem w komórce B4 znajdują się dane przeniesione z innej komórki ale nie zostaje przeniesione formatowanie i dlatego potrzebna mi taka funkcja.

    0
  • #9 03 Sie 2010 16:05
    marcinj12
    Poziom 40  

    Niestety, ja jedyne co Ci mogę podrzucić to makro odpalane z przycisku albo uruchamiane "zieloną strzałką":

    Code:

    Public Sub KopiujMnie()
        Range("C3").Select
        Selection.Copy
        Range("E5").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    End Sub

    Na funkcję nie mam pomysłu...
    -----
    Edit:
    jest jedno "obejście" które przychodzi mi do głowy: załóżmy że swoją funkcję fx=B4 i kolejne wpisujesz do 6 kolumny, wówczas można obsłużyć zdarzenie na zmianę dla danego arkusza, w ten sposób:
    Code:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 6 Then
        If Target.HasFormula Then
            adres = Mid(Target.Formula, 2, Len(Target.Formula) - 1)
            ActiveSheet.Range(adres).Copy
            Application.EnableEvents = False
            Target.PasteSpecial (xlPasteFormats)
            Application.EnableEvents = True
            Application.CutCopyMode = False
        End If
    End If
    End Sub

    Zakładając że funkcja ma postać "prostego" odwołania (=B4), w przeciwnym wypadku należy zmodyfikować funkcję wyciągającą adres (adres=...). Można ją ew. rozbudować o dodatkową funkcjonalność, np. czyszczenie formatu po usunięciu wartości.

    0
  • #10 04 Sie 2010 09:58
    walek33
    Poziom 28  

    Sam format komórki można skopiować stosując wklej specjalnie z zaznaczoną opcją formaty.

    0
  • #11 08 Sie 2010 11:07
    -Tomi-
    Poziom 13  

    Udało mi się wykombinować coś takiego ale to tylko pobiera wartość z danej komórki jak teraz zrobić żeby kopiowało format komórki

    Code:
    Function kopia(argument)
    

    Set myRange = argument
    kopia = myRange

    End Function

    0
  • #12 08 Sie 2010 18:07
    walek33
    Poziom 28  

    Przecież użycie tej funkcji to nic innego jak napisanie w komórce docelowej znaku "=" i adresu komórki nazwanej przez Ciebie argument. Po co więc komplikować sobie życie? Formatu komórki funkcją nie zmienisz. Możesz do tego użyć procedury, ale ta musi być uruchamiana z np. przycisku. Swoją funkcję możesz zapisać prościej:

    Code:

    Function Kopia(Zakres As Range)
        Kopia = Zakres
    End Function

    ale to nic nie zmienia.

    0
  • #13 08 Sie 2010 19:49
    adamas_nt
    Moderator Programowanie

    Zdaje się, że rozwiązanie "obejścia" kolegi marcinj12 z drobną przeróbką jest tym, czego szukasz...

    Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Column = 6 Then
        If Target.HasFormula Then
            adres = Mid(Target.Formula, 2, Len(Target.Formula) - 1)
            Application.EnableEvents = False
            'potrzebna wartosc a nie odwolanie
            ActiveSheet.Range(adres).Copy Target
            Application.EnableEvents = True
        End If
    End If
    End Sub

    0
  • #14 09 Sie 2010 14:21
    walek33
    Poziom 28  

    Moim skromnym zdaniem oba "obejścia" kolegów adamas_nt i marcinj12 działają i rozwiązują problem tylko częściowo. Wiążą się bowiem z jedną konkretną kolumną i działają tylko na jednym arkuszu. Wstawiając w 6-stej kolumnie odwołanie do innego arkusza nie sformatują komórek. Excel wywala się także przy użyciu formuły innej niż rzeczone "=A1". I nie to żebym się kogokolwiek czepiał. :D Jaki jest więc sens stosowania tego wynalazku?

    0
  • #15 09 Sie 2010 14:30
    marcinj12
    Poziom 40  

    Sens niewielki, ale kolega najwyraźniej się "uparł" żeby zrobić to w postaci funkcji ;)
    Moja rada w tym temacie: zrób to w postaci makra, wstaw sobie przycisk na formę, który po kliknięciu będzie Ci kopiował i wartości, i formaty i co tam jeszcze chcesz... Szkoda Twojego czasu na próby rozwiązania problemu w inny sposób, na 90% skazane na niepowodzenie...

    0