Как мне вернуть местоположение походных муравьев в Excel? - PullRequest
2 голосов
/ 05 декабря 2009

Я знаю о Application.CutCopyMode, но он возвращает только состояние CutCopyMode (False, xlCopy или xlCut).

Как мне вернуть адрес текущего скопированного диапазона в Excel с использованием VBA? Мне не нужен текущий выбранный диапазон (который является Application.Selection.Address). Мне нужен адрес диапазона ячеек с движущейся границей (марширующие муравьи) вокруг него.

Другими словами, если вы выбираете диапазон ячеек, нажимаете CTRL + C, а затем перемещаете выделение в другую ячейку, мне нужен адрес ячеек, которые были выбраны при нажатии CTRL + C.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 05 декабря 2009

Насколько я знаю, вы не можете сделать это с помощью VBA. Однако вы можете закодировать свой собственный экземпляр sub и сохранить исходный код в глобальной переменной.

Примерно так:

Option Explicit
Dim myClipboard As Range

Public Sub toClipboard(Optional source As Range = Nothing)
    If source Is Nothing Then Set source = Selection
    source.Copy
    Set myClipboard = source
End Sub
1 голос
/ 07 декабря 2009

Когда вы копируете диапазон, адрес копируется в буфер обмена вместе с другими форматами. Вы можете проверить это с помощью приложения Clipboard Viewer. Так что если вам нужен скопированный диапазон, возьмите его из буфера обмена. Это будет что-то вроде> $ A2: $ B5 или подобное

0 голосов
/ 08 декабря 2009

Единственный способ, которым я могу думать об этом, - отслеживать последний выбранный диапазон с помощью глобальной переменной и ждать, пока вы не решите, что действие копирования выполнено. К сожалению, это не так просто.

Ниже приведена быстрая попытка с двумя проблемами:

  1. Если вы дважды копируете одни и те же данные, не обновляется
  2. Если копия или вставка запущен из другого приложения, результаты может варьироваться.

Это один из тех последних приемов надежды при отслеживании событий, которые на самом деле не существуют. Надеюсь, это поможет.

''# Add a reference to : FM20.dll or Microsoft Forms 2.0
''# Some more details at http://www.cpearson.com/excel/Clipboard.aspx

Option Explicit

Dim pSelSheet As String
Dim pSelRange As String

Dim gCopySheet As String
Dim gCopyRange As String

Dim gCount As Long
Dim prevCBText As String

Dim DataObj As New MSForms.DataObject



Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
        ByVal Target As Excel.Range)

    CopyTest
    pSelSheet = Sh.Name
    pSelRange = Target.Address


    ''# This is only so you can see it working
    gCount = gCount + 1
    application.StatusBar = gCopySheet & ":" & gCopyRange & ", Count: " & gCount
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
    CopyTest ''# You may need to call CopyTest from other events as well.

    ''# This is only so you can see it working
    gCount = gCount + 1
    application.StatusBar = gCopySheet & ":" & gCopyRange & ", Count: " & gCount
End Sub




Sub CopyTest()
    Dim curCBText As String
    Dim r As Range
    DataObj.GetFromClipboard

    On Error GoTo NoCBData
      curCBText = DataObj.GetText
    On Error Resume Next


    ''# Really need to test the current cells values
    ''# and compare as well. If identical may have to
    ''# update the gCopyRange etc.

    If curCBText <> prevCBText Then
      gCopySheet = pSelSheet
      gCopyRange = pSelRange
      prevCBText = curCBText
    End If

  Exit Sub


NoCBData:
  gCopySheet = ""
  gCopyRange = ""
  prevCBText = ""
End Sub

Да, и извините за странные комментарии '' # они просто там, чтобы помочь подсветке синтаксиса SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...