Я провел большую часть последних нескольких недель, пытаясь создать несколько пользовательских форм (не из моих сильных сторон). С моей предполагаемой пользовательской формой пользователь может выбрать любые значения, которые они хотят в электронной таблице (например, цены активов), а затем применить счетчик, это подражает увеличению/уменьшению% в цене этих активов и т. Д., А затем они могут наблюдать, как это влияет на различные аспекты бизнеса. Затем у них есть две кнопки, одна из которых позволяет сохранить настроенные значения, а другая - для сброса значений.Изменить пользовательскую форму для работы на нескольких листах
До сих пор у меня есть одна пользовательская форма, которая, как представляется, работает на разных листах, но выбранные диапазоны должны быть смежными, и один, с большой помощью здесь (см. Предыдущий вопрос от меня самого), который отлично работает для несмежных выборов, однако они должны быть на одном листе. Однако в идеале я хотел бы иметь возможность выбирать несколько несмежных диапазонов по нескольким листам и иметь возможность редактировать их. Я уверенно информирован о том, что переменные диапазона могут относиться только к диапазонам на конкретном листе, который, я полагаю, является местом, где я ошибаюсь.
Код, который работает для несмежных диапазонов, ниже, я, честно говоря, не могу воспользоваться большим успехом для достижения этой цели, хотя мне нужна была большая помощь отсюда, и я полностью не прибрал его полностью , может ли кто-нибудь предложить, как я мог бы отредактировать или обновить это, чтобы одновременно работать с многочисленными листами и несмежными диапазонами?
Открытие Userform;
Public myRange As Range, myArea As Range
Public myCopy As Variant
Public i As Long, numAreas As Long
Public pvar As Double
Sub Button2_Click()
Spinner.Show
End Sub
пользовательской формы:
Option Explicit
'on opening userform this sets the variables
Private Sub UserForm_Activate()
pvar = 1
Set myRange = Selection
numAreas = myRange.Areas.Count
If numAreas = 1 Then
myCopy = myRange.Value
Else
ReDim myCopy(1 To numAreas)
For i = 1 To numAreas
myCopy(i) = myRange.Areas(i).Value
Next i
End If
End Sub
'Useful Subs
Sub RestoreVals(R As Range, V As Variant)
Dim A As Range
Dim i As Long, n As Long
n = R.Areas.Count
If n = 1 Then
R.Value = V
Else
For i = 1 To n
R.Areas(i).Value = V(i)
Next i
End If
End Sub
Sub Multiply(R As Range, p As Double)
Dim c As Range
For Each c In R.Cells
c.Value = p * c.Value
Next c
End Sub
'Spin Up button
Private Sub SpinButton1_SpinUp()
Dim myRange As Range, myCopy As Variant
Set myRange = Selection
'Reset Values so that pvar is * by the right values
CopyVals myRange, myCopy
Multiply myRange, (1/pvar)
'Now * by pvar
CopyVals myRange, myCopy
pvar = pvar + UpBox.Value/100
Multiply myRange, pvar
End Sub
' Spin Down button
Private Sub SpinButton1_SpinDown()
Dim myRange As Range, myCopy As Variant
Set myRange = Selection
'Reset Values so that pvar is * by the right values
CopyVals myRange, myCopy
Multiply myRange, (1/pvar)
'Now * by pvar
CopyVals myRange, myCopy
pvar = pvar - DownBox.Value/100
Multiply myRange, pvar
End Sub
'Button to return to starting values
Public Sub DefaultButton_Click()
If numAreas = 1 Then
myRange.Value = myCopy
Else
For i = 1 To numAreas
myRange.Areas(i).Value = myCopy(i)
Next i
End If
End Sub
'button to maintain adjusted values
Private Sub CommandButton1_Click()
UserForm3.Show
End Sub
Для хранения отдельных диапазонов вам понадобится «Коллекция» (или словарь или массив), чтобы вы могли прокручивать их, когда это необходимо. Как вы заявляете в своем сообщении, переменная «Range» может ссылаться только на диапазоны на одном листе. – Rory
Другие (возможные) подходы могут заключаться в том, чтобы скопировать ваши выборки на новый временный листок и работать с ними там, или просто поставить очередь листов и выполнять вычисления на одном листе за раз. – Lumigraphics