Как я получаю адрес диапазона включая название рабочего листа, но не имя рабочей книги, в Excel VBA?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
37
задан ashleedawg 27 June 2018 в 14:16
поделиться

5 ответов

Только способ, которым я могу думать, состоит в том, чтобы связать название рабочего листа со ссылкой на ячейку, следующим образом:

Dim cell As Range
Dim cellAddress As String
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)

РЕДАКТИРОВАНИЕ:

Изменяют последнюю строку к:

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 

, если Вы хотите, чтобы он работал, даже если существуют пробелы или другие забавные символы на имя листа.

53
ответ дан Ben Hoffstein 27 November 2019 в 04:40
поделиться

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

Dim cell As Range
Dim address As String
Set cell = Worksheets(1).Cells.Range("A1")
address = cell.address(External:=True)
address = Right(address, Len(address) - InStr(1, address, "]"))
3
ответ дан theo 27 November 2019 в 04:40
поделиться

[редактирование по телефону 21.04.2009]

    Как Micah указал, это только работает при именовании этого
    конкретный диапазон (следовательно.Name кто-либо?) Да, ой!

[/редактирование]

Немного поздно стороне, я знаю, но в случае, если кто-либо еще ловит это в поиске Google (как я просто сделал), Вы могли также попробовать следующее:

Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name

Это должно возвратить полный адрес, что-то как "=Sheet1! Дюйм за 1$A$.

Принятие Вас не хочет знака "равно", можно снять изоляцию с него с функцией Замены:

address = Replace(address, "=", "")
-2
ответ дан TimS 27 November 2019 в 04:40
поделиться

Почему бы просто не вернуть имя рабочего листа с адрес = cell.Worksheet.Name тогда вы можете снова объединить адрес следующим образом address = cell.Worksheet.Name & "!" & cell.Address

-1
ответ дан 27 November 2019 в 04:40
поделиться

Функция рабочего листа Address () делает именно это . Поскольку он недоступен через Application.WorksheetFunction , я придумал решение, используя метод Evaluate () .

Это решение позволяет Excel обрабатывать пробелы и другие забавные символы в имя листа, что является хорошим преимуществом по сравнению с предыдущими ответами.

Пример:

Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
    rng.Worksheet.Name & """)")

возвращает в точности «Sheet1! $ A $ 1» с объектом Range с именем rng , ссылающимся на ячейку A1 на листе Sheet1.

Это решение возвращает только адрес первой ячейки диапазона, не адрес всего диапазона («Sheet1! $ A $ 1» vs «Sheet1! $ A $ 1: $ B $ 2»). Поэтому я использую его в пользовательской функции:

Public Function AddressEx(rng As Range) As String

    Dim strTmp As String

    strTmp = Evaluate("ADDRESS(" & rng.Row & "," & _
        rng.Column & ",1,1,""" & rng.Worksheet.Name & """)")

    If (rng.Count > 1) Then

        strTmp = strTmp & ":" & rng.Cells(rng.Count) _
            .Address(RowAbsolute:=True, ColumnAbsolute:=True)

    End If

    AddressEx = strTmp

End Function

Полная документация по функции рабочего листа Address () доступна на веб-сайте Office: https://support.office.com/en-us/article/ADDRESS- function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

3
ответ дан 27 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: