Existe algum script em algum lugar ou uma maneira de modificar o Excel que permita que várias áreas selecionadas sejam copiadas e coladas?

0

A motivação por trás disso é que, no excel, depois de copiar um segmento de células, você só pode destacar mais células sem a capacidade de subtrair da seleção. Isso me incomodou, então hoje eu escrevi um script vba para subtrair de uma seleção as células que foram destacadas mais de uma vez.

SubMultiDeselect()DimrngAsRangeDimUniAsRange'thisistheunionDimIntersctAsRangeDimUnionMinusIntersectAsRangeDimsingleAreaAsRange'MsgBoxActiveCell.AddressIfSelection.Areas.Count>1ThenForEachsingleAreaInSelection.AreasForEachrngInsingleArea.CellsIfUniIsNothingThenSetUni=rngElseIfApplication.Intersect(Uni,rng)IsNothingThenSetUni=Union(Uni,rng)ElseIfIntersctIsNothingThenSetIntersct=rngElseIfIntersect(Intersct,rng)IsNothingThenSetIntersct=Union(Intersct,rng)EndIfNextrngNextsingleArea'MsgBoxUni.AddressIfIntersctIsNothingThenSetUnionMinusIntersect=UniElse'MsgBoxIntersct.AddressForEachsingleAreaInUniForEachrngInsingleArea.Cells'MsgBoxrng.AddressIfIntersect(rng,Intersct)IsNothingThenIfUnionMinusIntersectIsNothingThenSetUnionMinusIntersect=rngElseSetUnionMinusIntersect=Union(UnionMinusIntersect,rng)EndIfEndIfNextrngNextsingleAreaEndIf'ChecknotnullincaseeverycellwashighlightedmorethanonceIfNotUnionMinusIntersectIsNothingThenIfUnionMinusIntersect.Cells.Count>0ThenUnionMinusIntersect.SelectEndIfEndIfEndIfEndSub
Muitoparameuespanto,depoisdeterminar,descobriqueacópiadeváriasregiõesnãoépermitidanoexcel,oqueanulameupropósitousualdedestacaralgo.Antesdetentarimplementarumamulti-cópiaemulti-colar,euqueriasabersealguémjáfezisso.Seriabasicamentecopiarcadacélulaemrelaçãoaocantosuperioresquerdodaseleçãonacélulacorrespondenteemrelaçãoaocantosuperioresquerdodacélulaativa.

ArespostadeJordanfuncionamuitobem.Aquiestáumexemplodasaídafinal:

    
por user5389726598465 01.05.2017 / 05:05

1 resposta

2

Duas macros VB simples.

  1. Criar uma nova pasta de trabalho ativada para macro
  2. Crie as duas macro abaixo.
  3. Criar adicionar alguns valores para algumas células
  4. Executar a macro DeselectCell
    • Primeiro, selecione o intervalo inteiro que você deseja fornecer. Se estiver usando a Tabela de exemplo do Excel abaixo, insira: $A$1:$F$6 e pressione OK.
    • Agora, você precisa especificar quais células deseja selecionar. Basta clicar com o botão esquerdo para especificar um intervalo. (Pressione Ctrl e clique com o botão esquerdo para ter vários intervalos a serem desmarcados. Exemplo, insira: $A$1,$C$2,$C$6 e pressione OK.
  5. Neste ponto, você deve ter uma desmarque a área ativa como na imagem acima. Agora, basta executar a macro CopyMultipleSelection e especificar em qual célula você deseja colar os resultados. No nosso caso, digamos $A$9 , sua tabela copiada final será:

Tabela final colada : (Você terá uma célula vazia em vez de uma _, é somente por causa de problemas de formatação.

_   4   1   2   3   4
d   a   _   6   7   8
f   9   11  1   1   121
a   21  1   12  12  sa
b   a   a   sd  a   sa
324 234 _   23  423 42

Exemplo de tabela do Excel : canto superior esquerdo é a célula A1 e canto inferior direito é a célula F6

1   4   1   2   3   4
d   a   5   6   7   8
f   9   11  1   1   121
a   21  1   12  12  sa
b   a   a   sd  a   sa
324 234 234 23  423 42

Macros

Sub DeselectCell()
    Dim rng As Range
    Dim InputRng As Range
    Dim DeleteRng As Range
    Dim OutRng As Range
    xTitleId = "DeselectCell"
    Set InputRng = Application.Selection
    Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
    Set DeleteRng = Application.InputBox("Delete Range", xTitleId, Type:=8)
    For Each rng In InputRng
        If Application.Intersect(rng, DeleteRng) Is Nothing Then
            If OutRng Is Nothing Then
                Set OutRng = rng
            Else
                Set OutRng = Application.Union(OutRng, rng)
            End If
        End If
    Next
    OutRng.Select
End Sub

Sub CopyMultipleSelection()
    Dim SelAreas() As Range
    Dim PasteRange As Range
    Dim UpperLeft As Range
    Dim NumAreas As Integer, i As Integer
    Dim TopRow As Long, LeftCol As Integer
    Dim RowOffset As Long, ColOffset As Integer
    Dim NonEmptyCellCount As Integer
' Exit if a range is not selected
    If TypeName(Selection) <> "Range" Then
        MsgBox "Select the range to be copied. A multiple selection is allowed."
        Exit Sub
    End If
' Store the areas as separate Range objects
    NumAreas = Selection.Areas.Count
    ReDim SelAreas(1 To NumAreas)
    For i = 1 To NumAreas
        Set SelAreas(i) = Selection.Areas(i)
    Next
' Determine the upper left cell in the multiple selection
    TopRow = ActiveSheet.Rows.Count
    LeftCol = ActiveSheet.Columns.Count
    For i = 1 To NumAreas
        If SelAreas(i).Row < TopRow Then TopRow = SelAreas(i).Row
        If SelAreas(i).Column < LeftCol Then LeftCol = SelAreas(i).Column
    Next
    Set UpperLeft = Cells(TopRow, LeftCol)
' Get the paste address
    On Error Resume Next
    Set PasteRange = Application.InputBox _
    (Prompt:="Specify the upper left cell for the paste range:", _
    Title:="Copy Mutliple Selection", _
    Type:=8)
    On Error GoTo 0
' Exit if canceled
    If TypeName(PasteRange) <> "Range" Then Exit Sub
' Make sure only the upper left cell is used
    Set PasteRange = PasteRange.Range("A1")
' Check paste range for existing data
    NonEmptyCellCount = 0
    For i = 1 To NumAreas
        RowOffset = SelAreas(i).Row - TopRow
        ColOffset = SelAreas(i).Column - LeftCol
        NonEmptyCellCount = NonEmptyCellCount + _
        Application.CountA(Range(PasteRange.Offset(RowOffset, ColOffset), _
        PasteRange.Offset(RowOffset + SelAreas(i).Rows.Count - 1, _
        ColOffset + SelAreas(i).Columns.Count - 1)))
  Next i
' If paste range is not empty, warn user
  If NonEmptyCellCount <> 0 Then _
        If MsgBox("Overwrite existing data?", vbQuestion + vbYesNo, _
        "Copy Multiple Selection") <> vbYes Then Exit Sub
' Copy and paste each area
  For i = 1 To NumAreas
    RowOffset = SelAreas(i).Row - TopRow
    ColOffset = SelAreas(i).Column - LeftCol
    SelAreas(i).Copy PasteRange.Offset(RowOffset, ColOffset)
  Next i
End Sub
    
por 01.05.2017 / 06:27