2016-08-09 3 views
0

Я создал макрос, который добавляет префикс к текущему выбору. Это довольно просто, как вы можете видеть - это петли через видимые ячейки в выборе. Я добавил .SpecialCells(xlCellTypeVisible), потому что это повлияло на непреднамеренные ячейки при использовании фильтров.Не выбранные ячейки влияют при использовании Selection.SpecialCells (xlCellTypeVisible) '

Sub Prefix() 

Dim rng As Range 
Dim Prefix As String 
Prefix = "P" 

For Each rng In Selection.SpecialCells(xlCellTypeVisible) 
    rng = Prefix & rng 
Next rng 

End Sub 

В качестве примера, предположим, что мои данные Cells A1:A4 заполнены так:

Title 
1 
2 
1 

Моя проблема возникает, когда я делаю следующее:

  1. Положите Autofilter на интервале , и скрыть «2», который находится в A3
  2. Выбрать A2 (первый «1»)
  3. Запустить мой макрос

Проблема заключается в том, что вместо того, чтобы воздействовать только Cell A2 (выбранная клетка), он начинает применять префикс к первой строке (A1: Z1 и т.д.), пока я не отменить макрос. Он будет продолжать делать это с тысячами ячеек, если я позволю ему продолжать работать.

Эта проблема не возникает, когда мой выбор - несколько ячеек, или если я использую Selection, а не Selection.SpecialCells(xlCellTypeVisible), или если я применяю макрос к одной ячейке, когда ничто не отфильтровывается (скрыто).

У кого-нибудь есть идеи, почему выбор по умолчанию для всей электронной таблицы, когда у меня есть только одна ячейка?
В качестве альтернативы, может ли кто-нибудь предложить способ добавления таких префиксов, как VBA?

Я знаю, что использование формулы excel облегчит проблему, но это не практично для меня, и, несмотря на это, не так быстро, как щелчок макроса.

+1

Скорее всего, потому что ваш субордиант не знает, что такое Selection, поэтому он использует весь лист. Добавьте параметр диапазона для диапазона, в котором вы хотите, чтобы он работал, и передайте его в под. Замените Selection этим параметром, и он должен работать. – dinotom

+0

Не могли бы вы объяснить, что вы подразумеваете, добавив параметр диапазона? Я знаю, что могу запустить sub для работы с Range («a2: a4»). SpecialCells (xlCellTypeVisible) или что-то в этом роде, но я хочу иметь возможность использовать его для выбора, а не для редактирования макроса каждый раз.Я могу применить к 10 различным выборам в строке, которые не являются рядом друг с другом, поэтому не стоит тратить время на редактирование макрокода. – unknownengines

+0

Если вы хотите, чтобы он работал так, это должно было быть в событии изменения выбора рабочего листа. Я отправлю что-то короткое – dinotom

ответ

0

Вы можете использовать «Application.intersect», чтобы убедиться, что вы получите желаемый результат:

For each rng in Application.Intersect(Selection,ActiveSheet.Cells.SpecialCells(xlCellTypeVisible)) 
+0

Это еще нужно знать, какой выбор is – dinotom

0

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

Не знаете, почему вы заменяете знак минус, но при необходимости можете добавить его в этот код.

код Worksheet:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Call AddPrefix(Target) 
End Sub 

Добавить модуль и поместить этот код в нем.

Sub AddPrefix(rangeToPrefix) 
    Dim cCell As Range 
    Dim prefix As String 
    prefix = InputBox("Enter your country code", "Set Country Code", +33) 

    For Each cCell In rangeToPrefix.SpecialCells(xlCellTypeVisible) 
     If Not IsEmpty(cCell) Then cCell.Value = prefix & cCell.Value 
    Next cCell 
End Sub 
+0

Это интересное решение. Это довольно сложно включить и выключить, и для второй работы требуется небольшая работа. Я также пытаюсь использовать его без него, иногда решая применить изменение ко всему листу (и, таким образом, разбивая excel), казалось бы, наугад, но, по-видимому, я его неправильно использую. Я думаю, что альтернативой будет использовать мой оригинальный метод, но с 'If', который проверяет, будет ли' selection.SpecialCells (xlCellTypeVisible) 'вызывать ошибку, и если это произойдет, вместо этого использовать' selection'. – unknownengines

+0

Код, который я опубликовал, должен только изменять значения ячеек, которые вы вручную выбираете с помощью мыши (которая запускает событие selectionchange), и если ячейка пуста, t меняет значение. – dinotom