Динамический выбор ячеек Excel с VB .Net в проекте VS 2010
Я использую Visual Studio 2010, чтобы создать проект из шаблона книги Excel. VS2010 уже дает мне рабочую книгу с одним рабочим листом. Я добавил еще один. Проект состоит из следующих файлов: ThisWorkbook.vb Sheet1.vb Sheet2.vb
Каждый файл состоит из класса для каждого объекта: Sheet1.vb имеет свой класс Sheet1, класс Sheet2.vb Sheet2 и так далее.
Из справки MSDN и из других источников я понял, что могу получить доступ из файла vb или другого класса к другим объектам класса, используя выражение Globals:
Me.Range("A10").Value = "Validation time:"
Me.Range("B10").Value = ValidationTime_T1.Item(ValidationTime_T1.Count - 1) - ValidationTime_T0.Item(ValidationTime_T0.Count - 1)
Dim x As Double
Dim rowOffset As Integer
rowOffset = 3
For x = 0 To JobCounter
Globals.Sheet2.Cells(x + rowOffset, 1) = x
Globals.Sheet2.Cells(x + rowOffset, 2) = ASy_Start_Mem.Item(x)
Globals.Sheet2.Cells(x + rowOffset, 3) = WSZ_Start_Mem.Item(x)
Globals.Sheet2.Cells(x + rowOffset, 4) = WSZ_Start_Pk_Mem.Item(x)
Globals.Sheet2.Cells(x + rowOffset, 5) = PFU_Start_Mem.Item(x)
Как видите, я перемещаю данные с одного листа на другой или помещаю данные, находящиеся в памяти, в sheet2 из sheet1.
Все идет нормально. Было не так много проблем, которые я не мог решить самостоятельно.
Я думаю, что здесь хорошо бы отметить, что мой опыт работы с C, C++, Perl и VBA за последние 4 года, поэтому я борюсь с VB, так как уже совсем немного, нахожу.Net более полезным, пока мне не пришлось использовать это с Excel, это доставляет мне трудности.
Теперь мне нужно выбрать конкретные ячейки на основе позиций, и это не всегда одна и та же позиция, поэтому мне нужно выбирать их динамически, без жесткого кода, как я обнаружил на MSDN, форумах, StackOverFlow и других сайтах, решение, которое они дают, использовать:
Globals.Sheet2.Range("C7").Select()
И да, это хорошо для определенных ячеек, для которых вы используете строку для выбора.
Проблема в том, что мне нужно каждый раз выбирать разные ячейки в зависимости от данных за день, и я не знаю, как это сделать с помощью Range. В предыдущем коде вы можете видеть, что я использовал Cells для этого.
Я пробовал:
Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()
Потому что одно из определений Range утверждает, что я могу получить в качестве параметра два объекта Cells, но выдает ошибку. Я пытался создать объекты Range для положения ячеек. Я использовал объект Object с CType, и он также не работает.
Если кто-то может помочь, как я могу динамически выбирать ячейки, с помощью Range или Cells, или с обоими, или если у вас есть другое решение, я с радостью оценю это.
1 ответ
Во-первых, спасибо TnTinMn за ответ, и я снова прошу прощения за поздний ответ, это было безумием на работе.
Ну, я нашел решение благодаря вашему комментарию.
Кажется, существует известная проблема с Excel.Interop и Visual Basic .Net, которая называется "две точки". Обычно, когда вы программируете VB в VS, пишите несколько писем, и IntelliSense предлагает вам, что может быть доступно (свойство, метод или объект), затем вы вводите точку, и появляется другой список, показывающий, что доступно, как только вы выбрали два предыдущих категории вы либо назначаете их переменной или объекту, либо присваиваете им значение. Но вы все равно можете поставить еще одну точку и получить другой список, вот где VB запутался и не работает, вероятно, VS позволит вам поставить любое количество душ, но во время выполнения вы получите ошибку, которую я получил. Надеюсь, опытный сотрудник Stackru сможет объяснить это намного лучше.
Итак, решение для метода Select: сначала вам нужно сделать лист активным, затем вы можете использовать метод Select, так как TnTinMn предсказал, что ошибка была с методом Select.
Globals.Sheet2.Activate()
Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()
И теперь метод Select не выдает ошибку времени выполнения. С предыдущим кодом вы можете теперь пройти через любую ячейку без жесткого кодирования.
Следующее может также использоваться для хранения диапазонов данных из другого раздела, для последующего использования в диаграмме, например:
Dim dataX As Excel.Range
Dim dataY As Excel.Range
Dim dataRange As Excel.Range
dataX = Globals.Sheet6.Cells(xRow, XColumn)
dataY = Globals.Sheet6.Cells(yRow, yColumn)
dataRange = Application.Union(dataX, dataY)
Спасибо и надеюсь, что это поможет кому-то.