Excel VBA: Проблема с присвоением динамических переменных функции range

#excel #vba #function

#excel #vba #функция

Вопрос:

Я начал с присвоения переменных с помощью функции Dim. Эти переменные являются динамическими и меняются каждый раз, когда выполняется код. Переменными являются «opendate» и «enddate». Когда я хотел назначить их в функции диапазона, чтобы получить максимальное и минимальное значения в пределах этого диапазона, это каждый раз приводило к сбою. Я знаю, как получить минимальные и максимальные значения, если диапазон указан напрямую, т. Е. range («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. " opendate : enddate " должно быть opendate amp; ":" amp; enddate

2. Вы хотите создать диапазон из двух чисел?

3. На самом деле вы не можете создать диапазон от двух чисел до 4dps!

Ответ №1:

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

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

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

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

Set Rng = ActiveSheet.Range(opendate amp; ":" amp; 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" amp; opendate amp; ":D" amp; enddate)
  

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

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

Комментарии:

1. Привет и спасибо за ваш ответ! Однако я, похоже, сталкиваюсь с проблемой, реализуя ее таким образом, поскольку вместо фактических чисел я получаю ноль «0» в качестве минимального и максимального значений ;/

2. Есть ли у вас там несколько примеров фактических значений? предполагая, что ваши значения равны 0.xxxx … вам нужно найти способ перевести эти значения в фактические номера строк, которые можно использовать (т. Е. Округлить, как я предложил).