Avatar billede steensommer Praktikant
13. december 2003 - 12:02 Der er 23 kommentarer og
1 løsning

Kopier med VBA uden at ændre cellernes struktur

Jeg har lavet flere projektmapper til anvendelse af andre på min arbejdsplads.
Selvom jeg har forsøgt at vise hvor data skal skrives (gult markerede celler) hænder det alligevel at der skrives i de forkerte. Så gør brugeren det at hun/han forsøger at kopiere data (tekst)(ctrl + X) fra en merged celle til en anden hvorefter cellernes struktur ødelægges.
1) Jeg ville derfor gerne inaktivere ctrl + C, ctrl + X, ctrl + V
2) Lave en makro der kan hjælpe med at flytte texetn til det korrekte sted.

Er der nogle der har et forslag?

vh Steen
Avatar billede kabbak Professor
13. december 2003 - 13:19 #1
er både den rigtige celle og den forkerte celle merged

hvis det kun er den ene celle der er merged kan denne makro flytte værdien/ teksten.

Det gøres ved at makrere cellen med værdien og den hvor værdien er forkert skrevet og så kør makroen.

Sub BytOm()
    Dim A() As Variant, MM As Boolean
    b = Selection.Cells.Count
    ReDim A(b)
    i = 1
    MM = False
    For Each c In Selection
    Q = c.Address
      If Range(c.Address).MergeCells Then
        If MM = False Then
          A(i) = c.Value
          i = i + 1
          MM = True
        End If
      Else
        A(i) = c.Value
        i = i + 1
          MM = False
    End If
    Next
   
    MM = False
    i = 2
    For Each c In Selection
      If Range(c.Address).MergeCells Then
      If MM = False Then
        c.Value = A(i)
        i = i - 1
        MM = True
        End If
      Else
        c.Value = A(i)
        i = i - 1
        MM = False
      End If
    Next
   
End Sub
Avatar billede steensommer Praktikant
13. december 2003 - 13:36 #2
Ofte vil begge være merged - i andre tilfælde markerer de en hel blok (flere linier med tekstfelt) og forsøger at flytte dem.
Avatar billede kabbak Professor
13. december 2003 - 14:20 #3
angående punkt 1.
kopier virker jo også på højreklik, i menuen rediger ,ctrl + C,  ctrl + V
http://www.eksperten.dk/spm/353214

fjernelse af højreklik:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  Cancel = True
End Sub
Avatar billede steensommer Praktikant
13. december 2003 - 16:46 #4
Kunne man forestille sig at man kan deaktivere ctrl + C mv ved at tilegne dem en ny funktion?
Avatar billede kabbak Professor
13. december 2003 - 17:29 #5
Avatar billede steensommer Praktikant
14. december 2003 - 16:40 #6
Hm - jeg blev vist ikke meget klogere men du skal da ha' point for den med hø_klik

:0)
Avatar billede kabbak Professor
14. december 2003 - 17:37 #7
Jeg synes at vi skal vente, der kan jo være andre der har et bud.
Avatar billede b_hansen Novice
15. december 2003 - 08:05 #8
Vil det nemmeste ikke være at forebygge, at brugerne indtaster data de forkerte steder?

Jeg vil da foreslå, at du overveje at beskytte dine projektmapper, således at der kun kan indtastes i de celler, du frigiver. Det er den måde, jeg har løst problemet på. Og jeg har mange brugere, som laver input til eksempelvis månedlige budgetopfølgninger, og de har ikke mulighed for at indsætte data de forkerte steder.
Avatar billede steensommer Praktikant
15. december 2003 - 09:20 #9
Jo men dette er da beskyttede projektmapper men det er svært at undgå at brugerne skriver under den forkerte DATO (og man kan jo ikke skrivebeskytte ALT)
Avatar billede b_hansen Novice
15. december 2003 - 09:44 #10
Enig. Men man kan jo også tilføje datavalidering, så der kontrolleres, om det er korrekte data, der indtastes, eksempelvis en dato.
Avatar billede steensommer Praktikant
15. december 2003 - 09:46 #11
Det var jo en mulighed - jeg har i forvejen farvet en celle med dags dato gul for at undgå ovennævnte men det er IKKE nok :0(
Avatar billede b_hansen Novice
15. december 2003 - 09:51 #12
jamen du har da helt ret. De brugere er ret svære at styre *S*

Men dags dato kan faktisk også styres via datavalidering, hvis man "snyder" lidt. Sæt feltet til kun at acceptere en bestemt dato, og lav kontrollen på en celle, hvor du har indstatet formlen =IDAG().
Avatar billede steensommer Praktikant
15. december 2003 - 09:52 #13
Det må jeg prøve - men desværre først senere. Andet arbejde kalder :0)
Avatar billede bak Forsker
15. december 2003 - 12:11 #14
Jeg kan også bedst lide b hansens forslag men med udgangspunkt i dit oprindelige spm.
Prøv det her og se om det matcher, det du skal bruge.
Kør først RedifineKeys (disabler normal cut/copy)
Disse makroer ødelægger ikke oprindelig formatering.

Option Explicit
Public TempCopy As Variant
Public TempAddr As Range
Public TempCutCopyMode As Boolean
Public TempCutOrCopy  As Boolean

Sub MyCopy()
    TempCopy = Selection
    Set TempAddr = Selection
    TempCutCopyMode = True
    TempCutOrCopy = True
End Sub

Sub MyCut()
    TempCopy = Selection
    Set TempAddr = Selection
    TempCutCopyMode = True
    TempCutOrCopy = False
End Sub

Sub MyPaste()
    If TempCutCopyMode = True Then
        On Error Resume Next
        Selection.Resize(UBound(TempCopy, 1), UBound(TempCopy, 2)) = TempCopy
        If Error <> 0 Then
            Selection = TempCopy
            Error.Clear
        End If
        If TempCutOrCopy = False Then TempAddr.ClearContents
        TempCutCopyMode = False
    End If
End Sub

Sub RedefineKeys()
    EnableControl 21, False  ' cut
    EnableControl 19, False  ' copy
    EnableControl 22, False  ' paste
    Application.OnKey "^c", "MyCopy"
    Application.OnKey "^x", "MyCut"
    Application.OnKey "^v", "MyPaste"
End Sub
Sub NormalizeKeys()
    EnableControl 21, True  ' cut
    EnableControl 19, True  ' copy
    EnableControl 22, True  ' paste
    EnableControl 755, True  ' pastespecial
    Application.OnKey "^c"
    Application.OnKey "^v"
    Application.OnKey "+{DEL}"
    Application.OnKey "+{INSERT}"
    Application.CellDragAndDrop = True
End Sub

Sub EnableControl(Id As Integer, aktiv As Boolean)
  Dim CB As CommandBar
  Dim C As CommandBarControl
  On Error Resume Next
  For Each CB In Application.CommandBars
    Set C = CB.FindControl(Id:=Id, recursive:=True)
    If Not C Is Nothing Then C.enabled = aktiv
  Next
End Sub
Avatar billede steensommer Praktikant
15. december 2003 - 14:15 #15
Det fungerer bare perfekt bak - du er da genial.
Tak til jer alle. Point til kabbak og bak?
-->bak mail mig lige din adresse - jeg skylder dig jo noget ;0)
Avatar billede bak Forsker
15. december 2003 - 14:19 #16
jeg mailer :-)
Avatar billede kabbak Professor
15. december 2003 - 14:23 #17
er det ikke bak der skal have alle, det synes jeg. ;-))
Avatar billede steensommer Praktikant
15. december 2003 - 14:28 #18
eller 20:40 ?
--> bak den laver lidt løjer med mig. Jeg har indsat RedefineKeys i Workbook_Open og Normalizekeys i Workbook_beforeclose.
Koden er lagt i patient.xls der opstartes fra patientliste.xls. Men når jeg er tilbage i patientlisten genstarter patient.xls hvis jeg trykker ctrl + C /X - hvorfor nu det?
Avatar billede b_hansen Novice
15. december 2003 - 14:28 #19
enig.....
Avatar billede bak Forsker
22. december 2003 - 20:18 #20
kabbak, hvad venter du på  ??  :-)
Avatar billede steensommer Praktikant
22. december 2003 - 20:22 #21
Vedr ovenstående "klage" fungerede det ikke ved placering i Workbook_Open og Workbook_beforeclose. Til gengæld fungerer det fint ved placering i sub der er lavet til at lukke projektmappen. God jul til jer alle!
Avatar billede bak Forsker
22. december 2003 - 20:30 #22
I lige måde Steen :-)
Avatar billede kabbak Professor
22. december 2003 - 20:33 #23
bak > jeg vil ikke have nogen point, det er dig der har det rigtige.
Avatar billede steensommer Praktikant
22. december 2003 - 20:34 #24
Men så er det jo afgjort  ;0)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester