2015-07-01 4 views
1

Я надеюсь, что кто-то может помочь мне с запросом. Пока у меня есть таблица Excel, и вы выбираете ячейку, а затем нажмите кнопку, кнопка открывает форму пользователя с помощью полосы прокрутки и, когда вы используете полосу прокрутки, это редактирует число в ячейке на + -1 вверх/вниз до границ которые вы вводите в текстовые поля. Это перемещает графики, связанные с каждой ячейкой в ​​реальном времени. Когда я закрываю форму пользователя, исходные значения заполняются обратно в ячейках.Использование пользовательской формы для настройки диапазона ячеек

Надеюсь, что при использовании электронной таблицы люди смогут выбрать несколько ячеек (случайное число ячеек, иногда вы можете выбрать 2 или 7 или 10 для изменения), и пользовательская форма повлияет на все из них таким же образом выше, однако у меня возникают проблемы с этим. Это позволит людям увидеть влияние взаимодействия между этими элементами.

Чтобы заставить его работать на одной ячейке я определил переменную как открытые за пределами пользовательской формы, как так:

Public SelRange As Integer 

Тогда в UserForm_Initialize:

SelRange = Selection 

Тогда есть код макс, мин, приращениях и т. д., и когда используется полоса прокрутки, значение вносится в активную ячейку по коду:

Selection = SelRange 

Однако, если я выберу несколько ячеек и попробую сделать это, я получаю несоответствие типа, которое предполагает, что я должен определить SelRange по-другому, но я не могу понять, что это такое или даже если это действительно поможет ситуации.

Благодарим за помощь.

Полный код ниже:

код для кнопки:

 Public SelRange As Integer 

     Sub Button1_Click() 
     UserForm1.Show 
     End Sub 

Код для Scroll Bar в UserForm:

 Option Explicit 
     ' Sets default values for when the Userform is opened 
     Public Sub UserForm_Initialize() 

     MinBox.Value = -100 
     MaxBox.Value = 100 
     IncBox.Value = 5 

     SelRange = Selection 

     End Sub 

     'Ensures that the default starting point is midway between the min and max values specified 

     Sub scrollbar1_enter() 

     Dim x As Double 
     Dim y As Double 
     y = MaxBox.Value 
     x = MinBox.Value 
     ScrollBar1.Value = (x + y)/2 

     Selection = SelRange 

     End Sub 

     'Sets all parameters in the scroll bar 
     Private Sub Scrollbar1_Change() 

     ScrollBar1.Max = MaxBox.Value 
     ScrollBar1.Min = MinBox.Value 

     ScrollBar1.LargeChange = IncBox.Value 
     ScrollBar1.SmallChange = IncBox.Value 

     Selection = ScrollBar1 + SelRange 

     End Sub 

     'Default on exit of userform 
     Private Sub ScrollBar1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 

     Dim x As Double 
     Dim y As Double 

     y = MaxBox.Value 
     x = MinBox.Value 

     ScrollBar1.Value = (x + y)/2 

     End Sub 

     'ensures activecell is updated in real time with dragging of mouse 
     Private Sub ScrollBar1_Scroll() 

     Selection.Value = ScrollBar1.Value + SelRange 

     End Sub 
+1

Не будет ли SelRange быть диапазоном, а не целым? –

+0

Я пробовал это, и он дает мне ошибку «Объектная переменная или с блочной переменной не установлена» и не будет работать. – Sam

+0

, если 'SelRange' является« диапазоном », вам необходимо назначить ему, используя' Set' - 'Set SelRange = Selection'. – aucuparia

ответ

0

Ваш текущий код работает для одной ячейки, так как свойство по умолчанию Range объект Value. Таким образом, вы помещаете значение в выбранной ячейке в вашу переменную. Но для нескольких ячеек свойство Value вернет Array - который не поместится в Integer.

Похоже, что вам нужно объявить selRange как Range затем работать с этим:

Public selRange as Range 
'... 
If TypeName(Selection) = "Range" Then 
     Set selRange = Selection 
Else 
     'handle case when something other than cell(s) are selected here 
End If 
'rest of your code here 

Посмотрите на Range object reference in MSDN для получения информации о работе с Range. Свойства Cells и Value будут особенно полезными. В частности, для увеличения каждой ячейки в диапазоне вы можете сделать:

Dim getAllValuesAtOnceAsArray As Variant 
getAllValuesAtOnceAsArray = selRange.Value 

Dim singleCell As Range 
For Each singleCell In selRange.Cells 
     singleCell.Value = singleCell.Value + 1 
Next singleCell 

'Now write back the original values 
selRange.Value = getAllValuesAtOnceAsArray 

Одна вещь, чтобы отметить, что Range.Value всегда возвращает 2D массив, если есть больше чем одна клетка (даже если диапазон имеет только один ряд или один столбец). Таким образом, getAllValuesAtOnceAsArray(rowNumber,columnNumber) получает один элемент массива - и вам нужны оба индекса, даже если он всегда 1.На практике обычно проще использовать объект Range, поскольку существуют более гибкие способы доступа к отдельным ячейкам (Cells, Offset, Rows, Columns и т. Д.).

+0

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

Смежные вопросы