Excel VBA: проблема с назначением динамических переменных для функции диапазона - PullRequest
0 голосов
/ 23 апреля 2019

Я начал с назначения переменных с помощью функции Dim.Эти переменные являются динамическими и меняются каждый раз, когда выполняется код.Переменными являются «opendate» и «enddate».Когда я хотел назначить их в функции диапазона, чтобы получить максимальные и минимальные значения в этом диапазоне, он каждый раз терпел неудачу.Я знаю, как получить минимальное и максимальное значения, если диапазон указан напрямую, то есть диапазон («D20: D41»), но я хочу поправку, когда дело доходит до такого случая, как этот.Пожалуйста, смотрите прикрепленный код ниже, поскольку я знаю, что я не полностью согласен с этим объяснением.Спасибо

Public sub aom()

'This is a normal case scenario

set rng=activesheet.range("D20:D40")

Range("L32").Value = WorksheetFunction.Max(Rng)
Range("L33").Value = WorksheetFunction.Min(Rng)

End sub


Public Sub aomhigh()

'This is my case

'Firstly i declare my variables(note that those variables are numbers up to 4 dp)

Dim opendate As Double
    activecell.offset(0, -7).Select
    opendate = activecell.Value

activecell.offset(0, 7).Select
Selection.End(xlDown).Select
activecell.offset(-1, 0).Select

Dim enddate As Double
    activecell.offset(0, -7).Select
    enddate = activecell.Value

'Then i think the way to declare them in the range function is something like this even though it seems i never get it right

Set Rng = ActiveSheet.Range(" + opendate + : + enddate + ") '<- This is where the problem is

'Then the normal finding for max and min values as usual

Range("L32").Value = WorksheetFunction.Max(Rng)
Range("L33").Value = WorksheetFunction.Min(Rng)

End sub

1 Ответ

0 голосов
/ 23 апреля 2019

добро пожаловать в SO.

Вы можете строить динамические диапазоны, хотя вам придется изменить свой подход к нему.

Если вы хотите использовать объект Range так, как вы его используете в данный момент, вам понадобится что-то похожее:

Dim opendate as String, enddate as String 'Not as Double!
opendate = "D20"
enddate = "D40"

Set Rng = ActiveSheet.Range(opendate & ":" & enddate)

Если у вас есть фиксированный столбец с этими значениями, но вы хотите только динамически изменять строки, вы можете изменить это на что-то вроде этого:

Dim opendate As Long
    activecell.offset(0, -7).Select
    opendate = activecell.Value

activecell.offset(0, 7).Select
Selection.End(xlDown).Select
activecell.offset(-1, 0).Select

Dim enddate As Long
    activecell.offset(0, -7).Select
    enddate = activecell.Value

Set Rng = ActiveSheet.Range("D" & opendate & ":D" & enddate)

На самом деле все зависит от содержимого тех ячеек, из которых вы получаете эти значения, а диапазон, насколько я знаю, не требует десятичных дробей, хотя я никогда не пробовал. Если значения имеют до 4 точек на дюйм, но ваш код все еще зависит от них, я предлагаю использовать формулу, чтобы получить округленное значение до ближайшего полного числа, то есть: 4.5744 = 4 или 5 (в зависимости от ваших потребностей).

При этом я не советую использовать .Select и activecell. в качестве "динамического" выбора, это как бы отрицательно сказывается на цели сделать ваш код динамичным ...

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