VBA Поиск следующего столбца на основе входного значения

В программе, которую я сейчас пытаюсь написать, я беру два столбца чисел и выполняю вычисления на них. Я не знаю, где находятся эти два столбца, пока пользователь не скажет мне (они вводят значение столбца в ячейке в книге, в которой находится мой код).

Например, если пользователь вводил «A» и «B» в качестве столбцов, где находится вся информация, я могу выполнять вычисления на основе этих значений. Аналогично, если они хотят проанализировать другой рабочий лист (или книгу), а столбцы находятся в «F» и «G», они могут ввести их. Проблема в том, что я прошу пользователя ввести эти два столбца, а также четыре других (последние четыре являются столбцами результатов). Я сделал это в надежде, что смогу сделать это гибким, но теперь гибкость приемлема.

Мой вопрос в том, что если мне будет дано значение, где будет какая-то информация (скажем, «F»), как я могу выяснить, какой столбец будет после или до этого введенного значения. Поэтому, если мне дается только «F», я смогу создать переменную для хранения столбца «G».

Ниже приведены примеры того, как переменные работали до того, как мне понадобилась эта новая проблема:

Dim first_Column As String Dim second_Column As String Dim third_Column As String first_Column = Range("B2").Text second_Column = Range("B3").Text third_Column = Range("B4").Text 

Здесь ячейки B2 – B4 находятся там, где пользователь вводит значения. Как правило, я хочу иметь возможность не иметь B3 и B4. Я чувствую, что смещение (0,1) может каким-то образом помочь, но до сих пор я не смог его правильно реализовать.

Спасибо,

Джесси Смонтермон

Вот две функции, которые помогут вам справиться со столбцами> «Z». Они преобразуют текстовую форму столбца в индекс столбца (как длинное значение) и наоборот:

 Function ColTextToInt(ByVal col As String) As Long Dim c1 As String, c2 As String col = UCase(col) 'Make sure we are dealing with "A", not with "a" If Len(col) = 1 Then 'if "A" to "Z" is given, there is just one letter to decode ColTextToInt = Asc(col) - Asc("A") + 1 ElseIf Len(col) = 2 Then c1 = Left(col, 1) ' two letter columns: split to left and right letter c2 = Right(col, 1) ' calculate the column indexes from both letters ColTextToInt = (Asc(c1) - Asc("A") + 1) * 26 + (Asc(c2) - Asc("A") + 1) Else ColTextToInt = 0 End If End Function Function ColIntToText(ByVal col As Long) As String Dim i1 As Long, i2 As Long i1 = (col - 1) \ 26 ' col - 1 =i1*26+i2 : this calculates i1 and i2 from col i2 = (col - 1) Mod 26 ColIntToText = Chr(Asc("A") + i2) ' if i1 is 0, this is the column from "A" to "Z" If i1 > 0 Then 'in this case, i1 represents the first letter of the two-letter columns ColIntToText = Chr(Asc("A") + i1 - 1) & ColIntToText ' add the first letter to the result End If End Function 

Теперь ваша проблема может быть решена легко, например

 newColumn = ColIntToText(ColTextToInt(oldColumn)+1) 

EDITED соответственно замечанию mwolfe02:

Конечно, если вас не интересуют имена столбцов, но просто хочу получить объект диапазона определенной ячейки в данной строке прямо под столбцом, заданным пользователем, этот код «overkill». В этом случае простая

  Dim r as Range Dim row as long, oldColumn as String ' ... init row and oldColumn here ... Set r = mysheet.Range(oldColumn & row).Offset(0,1) ' now use r to manipulate the cell right to the original cell 

сделаю это.

Вы были на правильном пути с Offset . Вот тестовая функция, которая показывает несколько разных подходов, чтобы взять с собой:

 Sub test() Dim first_Column As String Dim second_Column As String Dim third_Column As String Dim r As Range first_Column = Range("B2").Text second_Column = Range("B2").Offset(1, 0).Text third_Column = Range("B2").Offset(2, 0).Text Debug.Print first_Column, second_Column, third_Column Set r = Range("B2") first_Column = r.Text Set r = r.Offset(1, 0) second_Column = r.Text Set r = r.Offset(1, 0) third_Column = r.Text Debug.Print first_Column, second_Column, third_Column End Sub 

ОБНОВЛЕНИЕ : после повторного чтения вашего вопроса я понимаю, что вы пытались сделать смещения на основе введенного пользователем столбца. Ответ @ rskar сдвинет букву столбца, но будет намного проще работать с номером столбца в коде. Например:

 Sub test() Dim first_Col As Integer, second_Col As Integer first_Col = Cells(, Range("B2").Text).Column second_Col = first_Col + 1 Cells.Columns(first_Col).Font.Bold = True Cells.Columns(second_Col).Font.Italic = True End Sub 

Есть несколько синтаксических проблем с ответом @ rskar. Однако было полезно создать функцию, которая захватывает колонку «письмо» на основе входного столбца «буква» и желаемого смещения вправо:

 Public Function GetNextCol(TheCol As String, OffsetRight As Integer) As String Dim TempCol1 As String Dim TempCol2 As String TempCol1 = Range(TheCol & "1").Address TempCol2 = Range(TempCol1).Offset(0, OffsetRight).Address(0, 0, xlA1) GetNextCol = Left(TempCol2, Len(TempCol2) - 1) End Function 

В свете комментариев других (и все они подняли действительные баллы), здесь гораздо лучшее решение проблемы, используя Offset и Address :

 Dim first_Column As String Dim second_Column As String Dim p As Integer first_Column = Range("B2").Text second_Column = _ Range(first_Column + ":" + first_Column).Offset(0, 1).Address(0, 0, xlA1) p = InStr(second_Column, ":") second_Column = Left(second_Column, p - 1) 

Вышеупомянутое должно работать для любого действительного имени столбца, «Z» и «AA» и т. Д.

Используйте функции Asc () и Chr () в VBA, например:

 Dim first_Column As String Dim second_Column As String first_Column = Range("B2").Text second_Column = Chr(Asc(first_Column) + 1) 

Функция Asc( s ) возвращает код ASCII (в целых числах, обычно между 0 и 255) первого символа строки «s».

Функция Chr( c ) возвращает строку, содержащую символ, который соответствует заданному коду «c».

Буквы верхнего регистра (A thru Z) являются кодами ASCII с 65 по 90. Для более подробной информации обратитесь к Google ASCII.

ПРИМЕЧАНИЕ. Вышеприведенный код будет в порядке, если первая_колонна находится между «A» и «Y»; для столбцов «AA» и т. д., это займет немного больше работы, но Asc () и Chr () все равно будут билетом для кодирования для этого.

Interesting Posts

Запросить данные MySQL из Excel (или наоборот)

excel создать дополнительный лист

Скрыть определенные ячейки в строке в VBA excel

VBA Ошибка времени выполнения 424 требуется объект

Создание отчетов Excel с помощью гиперссылок на другие листы Excel через SSRS 2016

Чтение превосходства с пандами на основе цветов колонок

Динамическая ссылка на вышеуказанную ячейку

Установка названия серии в Excel Graph вызывает мерцание

Как я могу запускать команды Python из Excel VBA?

PHPExcel не отображает все строки, используя php

Пользовательская функция не будет обновляться автоматически (для параметров установлены автоматические вычисления!)

Cutting Row с данными и переходом на другой лист VBA

Цифровой выход формата формы VBA

Ошибка времени выполнения «1004»: ошибка, определяемая приложением или объектная ошибка. (копирование и вставка результатов)

Извлечение определенных данных из txt-файла

Давайте будем гением компьютера.