VBA Поиск следующего столбца на основе входного значения - PullRequest
0 голосов
/ 03 марта 2011

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

Например, если пользователь ввел "«» И «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) может как-то помочь, но до сих пор я не смог правильно его реализовать.

Спасибо,

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

Ответы [ 5 ]

2 голосов
/ 27 февраля 2013

Есть несколько синтаксических проблем с ответом @ 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
2 голосов
/ 03 марта 2011

Вы были на правильном пути с 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
2 голосов
/ 03 марта 2011

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

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)

отредактировано в соответствии с замечанием mwolfe02:

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

 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

сделает это.

1 голос
/ 03 марта 2011

В свете комментариев других (и все они подняли действительные вопросы), вот гораздо лучшее решение проблемы, используя 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" и т. Д.

0 голосов
/ 03 марта 2011

Используйте функции 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 до Z) являются кодами ASCII с 65 по 90. Для более подробной информации просто обратитесь к Google ASCII.

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

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