Vba excel значение ячейки на другом листе

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

Имеется следующий фрагмент:

h = Sheets(«дд»).Range(«A62000»).End(xlUp).Row
d = Sheets(«дд»).Range(Cells(2, 1), Cells(h, 2)).Value

Собственно говоря, необходимо присвоить в переменную значения некоторого диапазона с другого листа. Почему-то на 2 строке выдает ошибку «Run-time error 1004»
Если же мы находимся на этом самом листе или добавляем перед этим
Sheets(«дд»).select
то все нормально работает.
Может, кто-нибудь знает, в чем причина?..

 

ber$erk

Пользователь

Сообщений: 2735
Регистрация: 25.12.2012

#2

19.02.2013 11:08:13

Код
d = Sheets("дд").resize(h-1, 2).Value

Учимся сами и помогаем другим…

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#3

19.02.2013 11:18:51

Попробуйте так

Код
With Sheets("дд")
h = .Range("A62000").End(xlUp).Row 
d = .Range(.Cells(2, 1), .Cells(h, 2)).Value
End With
 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

Тоже самое, на 2-й строке ошибка выдается…
Excel 2007, если чего…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

dx01 = Sheets(«дд»;).Range(«A2»;).Resize(h — 1, 2).Value

ber$erk, так — да, работает… Спасибо…

Все равно вопрос-то остается в причине ошибки, т.к не особенно понятно, откуда она возникает-то…
Относительно исходного варианта интересно — это у меня excel кривой стоит, или так на самом деле нельзя писать (почему???)…

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Файл приложите в формате .xls

 

ber$erk

Пользователь

Сообщений: 2735
Регистрация: 25.12.2012

#7

19.02.2013 12:07:07

Цитата
denis76 пишет:

Все равно вопрос-то остается в причине ошибки, т.к не особенно понятно, откуда она возникает-то…
Относительно исходного варианта интересно — это у меня excel кривой стоит, или так на самом деле нельзя писать (почему???)

Меня смущает, что код Кузьмича выдает у Вас ошибку, а он ее выдавать не должен (у меня его код отрабатывает нормально). А по поводу ситуации в целом:
изначально в коде

Код
d = Sheets("дд").Range(Cells(2, 1), Cells(h, 2)).Value

Cells(2, 1) и Cells(h, 2) ссылаются на ячейки другого (отличного от «дд») листа. Поэтому и вылезает ошибка пока напрямую не указать нужный лист (ну или не перейти на него).

Учимся сами и помогаем другим…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#8

19.02.2013 13:12:53

Цитата
ber$erk пишет:

Cells(2, 1) и Cells(h, 2) ссылаются на ячейки другого (отличного от «дд») листа. Поэтому и вылезает ошибка пока напрямую не указать нужный лист (ну или не перейти на него).

Ну как бы мне кажется, что мы тут ведь и пишем явным образом указание на нужный лист —  
Sheets(«дд»).Range(Cells…
или, аналогично,
With Sheets(«дд»)…
,однако не работает…
Тогда как в 1-й строке у нас тоже указание на другой лист
h = Sheets(«дд»).Range(«A62000»).End(xlUp).Row
,однако работает…

Насчет вставить файл — не знаю, как его сюда вставлять, но если отбросить ненужное, суть его такая:
есть 2 листа, на листе «дд» в первых 2 столбцах какие-то данные, далее пишем:

Sub p40()

  hd = Sheets(«дд»).Cells(62000, 1).End(xlUp).Row
  dx01 = Sheets(«дд»).Range(Cells(2, 1), Cells(hd, 2)).Value

End Sub

ну и запускаем, находясь на другом листе… и пишет ошибку…

Resize работает нормально…

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#9

19.02.2013 13:19:49

Цитата
denis76 пишет:
Насчет вставить файл — не знаю, как его сюда вставлять

А что тут непонятного? См. файл.

Прикрепленные файлы

  • Прикрепить файл.jpg (28.09 КБ)

 

Alex K

Пользователь

Сообщений: 26
Регистрация: 01.01.1970

denis76, из своего опыта могу сказать, что многие свойства и методы объекта Range (например, Find) не работают, если лист не является активным. IMHO это следует воспринимать как данность и при обращениях к Range сначала использовать Sheets(имя листа).Select или Activate.

 

ber$erk

Пользователь

Сообщений: 2735
Регистрация: 25.12.2012

#11

19.02.2013 13:30:25

Цитата
denis76 пишет:
Ну как бы мне кажется, что мы тут ведь и пишем явным образом указание на нужный лист —
Sheets(«дд»).Range(Cells…

явно Вы указываете только Sheets(«дд»).Range, а вот Cells(2, 1) и Cells(h, 2) это уже ячейки ТЕКУЩЕГО листа. т.е. явно заданное будет выгляеть так:

Код
Sheets("дд").Range(Sheets("дд").Cells(2, 1), Sheets("дд").Cells(h, 2)).Value

Учимся сами и помогаем другим…

 

Alex K

Пользователь

Сообщений: 26
Регистрация: 01.01.1970

Пример.
Вот такой код выдаст ошибку:
Sheets(«Лист1»).Activate
Set h = Sheets(«Лист2″).Range(Cells(1, 1), Cells(10, 10)).Find(What:=»something»)

А вот такой будет работать:
Sheets(«Лист2»).Activate
Set h = Sheets(«Лист2″).Range(Cells(1, 1), Cells(10, 10)).Find(What:=»something»)

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Не нужны для Find Select’ы:

Sub tt()
   Sheets(«Лист1»).Activate ‘это для демонстрации! Не нужно для работы.
   With Sheets(«Лист2»)
       Set h = Range(.Cells(1, 1), .Cells(10, 10)).Find(What:=»something»)
   End With
   If Not h Is Nothing Then MsgBox h.Address
End Sub

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#14

19.02.2013 14:09:06

Цитата
ber$erk пишет:
явно Вы указываете только Sheets(«дд»).Range, а вот Cells(2, 1) и Cells(h, 2) это уже ячейки ТЕКУЩЕГО листа

Понятно… хотя на мой взгляд нелогично это… да и то, что With даже не помогает…
Ну ладно, а то думал, может я чего-то элементарного не понимаю, а раз так сделано, то вопросы к разработчикам… будем

Цитата
Alex K пишет:
воспринимать как данность…

Всем спасибо за пояснения…

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#15

19.02.2013 14:16:38

Цитата
denis76 пишет:
что With даже не помогает..

Поможет, если код не в модуле листа. Иначе всё равно придётся указывать для каждой ячейки ещё и лист.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

Код кстати не в модуле листа, в обычном модуле…

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#17

19.02.2013 14:45:15

Тогда with-end with поможет. Ведь специально для этого сделано. Только точки не забывайте ставить  :)

I want to get values from other sheets.

I have some values in Excel (sheet2) for example:

    A  B  C  D
    -  -  -  -  
1 | 2  5  9  12
2 | 5  8  4  5
3 | 3  1  2  6

I sum each column in row 4.

I’m working with these values in sheet2 but I want to get the result in sheet1.

When using my code in sheet2 I get the correct answer but when I try to use it in a different sheet I get the result of the values corresponding to the current sheet cells and not to sheet2.

I’m using With Application.WorksheetFunction.

How can I set sheet2 as the active sheet?

Community's user avatar

asked Nov 10, 2010 at 20:29

Apollon1954's user avatar

Try

 ThisWorkbook.Sheets("name of sheet 2").Range("A1")

to access a range in sheet 2 independently of where your code is or which sheet is currently active. To make sheet 2 the active sheet, try

 ThisWorkbook.Sheets("name of sheet 2").Activate

If you just need the sum of a row in a different sheet, there is no need for using VBA at all. Enter a formula like this in sheet 1:

=SUM([Name-Of-Sheet2]!A1:D1)

answered Nov 10, 2010 at 20:35

Doc Brown's user avatar

Doc BrownDoc Brown

19.6k7 gold badges52 silver badges88 bronze badges

That will be (for you very specific example)

ActiveWorkbook.worksheets("Sheet2").cells(aRow,aCol).Value=someval

OR

someVal=ActiveWorkbook.worksheets("Sheet2").cells(aRow,aCol).Value

So get a F1 click and read about Worksheets collection, which contains Worksheet objects, which in turn has a Cells collection, holding Cell objects…

answered Nov 10, 2010 at 20:35

jpinto3912's user avatar

jpinto3912jpinto3912

1,4652 gold badges12 silver badges19 bronze badges

Sub TEST()
Dim value1 As String
Dim value2 As String
value1 = ThisWorkbook.Sheets(1).Range("A1").Value 'value from sheet1
value2 = ThisWorkbook.Sheets(2).Range("A1").Value 'value from sheet2
If value1 = value2 Then ThisWorkbook.Sheets(2).Range("L1").Value = value1 'or 2
End Sub

This will compare two sheets cells values and if they match place the value on sheet 2 in column L.

answered Jul 16, 2016 at 8:16

James Heffer's user avatar

James HefferJames Heffer

6751 gold badge6 silver badges17 bronze badges

4

SomeVal=ActiveWorkbook.worksheets("Sheet2").cells(aRow,aCol).Value

did not work. However the following code only worked for me.

SomeVal = ThisWorkbook.Sheets(2).cells(aRow,aCol).Value

Zoe stands with Ukraine's user avatar

answered May 11, 2015 at 6:33

RanonKahn's user avatar

RanonKahnRanonKahn

84110 silver badges31 bronze badges

6

Try the worksheet activate command before you need data from the sheet:

objWorkbook.WorkSheets(1).Activate
objWorkbook.WorkSheets(2).Activate

DimaSan's user avatar

DimaSan

12.1k11 gold badges66 silver badges75 bronze badges

answered Jun 20, 2017 at 13:20

Mike's user avatar

Maybe you can use the script i am using to retrieve a certain cell value from another sheet back to a specific sheet.

Sub reviewRow()
Application.ScreenUpdating = False
Results = MsgBox("Do you want to View selected row?", vbYesNo, "")
If Results = vbYes And Range("C10") > 1 Then
i = Range("C10") //this is where i put the row number that i want to retrieve or review that can be changed as needed
Worksheets("Sheet1").Range("C6") = Worksheets("Sheet2").Range("C" & i) //sheet names can be changed as necessary
End if
Application.ScreenUpdating = True
End Sub

You can make a form using this and personalize it as needed.

answered Aug 23, 2019 at 4:50

Joni Depp's user avatar

Usually I use this code (into a VBA macro) for getting a cell’s value from another cell’s value from another sheet:

Range(«Y3») = ActiveWorkbook.Worksheets(«Reference»).Range(«X4»)

The cell Y3 is into a sheet that I called it «Calculate»
The cell X4 is into a sheet that I called it «Reference»
The VBA macro has been run when the «Calculate» in active sheet.

answered Jul 24, 2020 at 20:31

Kasra's user avatar

KasraKasra

1054 silver badges13 bronze badges

В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.

Обращение к конкретной ячейке

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

Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

  • С помощью Range
  • С помощью Cells

Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

Workbooks("Книга1.xls").Sheets("Лист1").Range("A3") ' Обратиться к ячейке A3
Workbooks("Книга1.xls").Sheets("Лист1").Cells(3, 1) ' Обратиться к ячейке в 3-й строке и 1-й колонке (A3)

Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:

Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

Range("A1")
Cells(1, 1)

Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

With Workbooks("Книга1").Sheets("Лист2")
  ' Вывести значение ячейки A1, которая находится на Листе2
  MsgBox .Range("A1")
  ' Вывести значение ячейки B1, которая находится на Листе2
  MsgBox .Range("B1")
End With

Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

Application.ActiveCell ' полная запись
ActiveCell ' краткая запись

Чтение значения из ячейки

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

  • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
  • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
  • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Cells(1, 1)        ' выведет 01.03.2018
MsgBox Cells(1, 1).Value  ' выведет 01.03.2018
MsgBox Cells(1, 1).Value2 ' выведет 43160
MsgBox Cells(1, 1).Text   ' выведет 01 марта 2018 г.

Dim d As Date
d = Cells(1, 1).Value2    ' числовое представление даты преобразуется в тип Date
MsgBox d                  ' выведет 01.03.2018

Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Range("C1")        ' выведет 123,4568
MsgBox Range("C1").Value  ' выведет 123,4568
MsgBox Range("C1").Value2 ' выведет 123,456789
MsgBox Range("C1").Text   ' выведет 123,457р.

Dim c As Currency
c = Range("C1").Value2    ' значение преобразуется в тип Currency
MsgBox c                  ' выведет 123,4568

Dim d As Double
d = Range("C1").Value2    ' значение преобразуется в тип Double
MsgBox d                  ' выведет 123,456789

При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Dim s As String
Dim i As Integer
s = Range("B1").Value2 ' успех
i = Range("B1").Value2 ' ошибка

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Range("A1") = 123.45
Range("A1").Value = 123.45
Range("A1").Value2 = 123.45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

Cells(2, 1) = #3/1/2018#
Cells(2, 1).Value = #3/1/2018#
Cells(2, 1).Value2 = #3/1/2018#

В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.

Обращение к ячейке в другой книге Excel из кода VBA по ссылке, содержащейся в ячейке текущей книги. Переход по ссылке в другую книгу. Примеры.

Ссылки на другую книгу

В ячейку «A1» листа «Лист6» текущей книги вставлена ссылка на ячейку «C12» листа «Лист1» книги «Другая книга.xlsm».

Ссылка в ячейке, если книга «Другая книга.xlsm» открыта:

=‘[Другая книга.xlsm]Лист1’!$C$12

Ссылка в ячейке, если книга «Другая книга.xlsm» закрыта:

=‘C:UsersEvgeniyDesktop[Другая книга.xlsm]Лист1’!$C$12

Если путь до ячеек содержит пробелы, как в этом примере, он заключается в апострофы.

Перед обращением к другой книге необходимо проверить – открыта ли она. Если книга закрыта, ее следует открыть. Один из вариантов кода смотрите в параграфе «Примеры обращения к другой книге».

Обращение к ячейке по ссылке

Обращение из кода VBA Excel к ячейке в другой книге для определения ее координат по ссылке из ячейки «Лист6!A1» текущей книги:

MsgBox Range(ThisWorkbook.Sheets(«Лист6»).Range(«A1»).Formula).Row  ‘Результат = 12

MsgBox Range(ThisWorkbook.Sheets(«Лист6»).Range(«A1»).Formula).Column  ‘Результат = 3

Примеры обращения к другой книге

Условие

В ячейке «A1» листа «Лист6» текущей книги размещена ссылка: ='[Другая книга.xlsm]Лист1'!$C$12. Необходимо перейти по ссылке из ячейки «Лист6!A1» в другую книгу, скопировать диапазон из 9 ячеек (3х3) в другой книге, где первой ячейкой диапазона является ячейка из ссылки, и вставить скопированный диапазон в диапазон «Лист6!A2:C4» текущей книги.

Решение

Если точно известно, что другая книга открыта:

Sub Primer1()

    With ThisWorkbook.Sheets(«Лист6»)

        Range(.Range(«A1»).Formula).Resize(3, 3).Copy .Range(«A2:C4»)

    End With

End Sub

Если неизвестно, открыта другая книга или нет:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

‘Функция для проверки состояния книги (открыта или нет)

Function BookOpenClosed(wbName As String) As Boolean

    Dim myBook As Workbook

    On Error Resume Next

        Set myBook = Workbooks(wbName)

    BookOpenClosed = Not myBook Is Nothing

End Function

Sub Primer2()

Dim s1 As String, s2 As String, s3 As String, n1 As Long, n2 As Long

    ‘записываем ссылку из ячейки Лист6!A1 в переменную s1

    s1 = ThisWorkbook.Sheets(«Лист6»).Range(«A1»).Formula

    ‘вырезаем имя книги из ссылки и записываем в переменную s2

    n1 = InStr(s1, «[«)

    n2 = InStr(s1, «]»)

    s2 = Mid(s1, n1 + 1, n2 n1 1)

        ‘проверяем состояние книги

        If Not BookOpenClosed(s2) Then

            ‘если книга закрыта, вырезаем путь к ней из ссылки и записываем в переменную s3

            n1 = InStr(s1, «:») — 1

            n2 = InStrRev(s1, ««)

            s3 = Mid(s1, n1, n2 n1 + 1)

            ‘открываем другую книгу, объединив путь к ней и ее имя

            Workbooks.Open (s3 & s2)

        End If

    ‘копируем ячейки из другой книги в текущую

    Range(s1).Resize(3, 3).Copy ThisWorkbook.Sheets(«Лист6»).Range(«A2:C4»)

End Sub

И еще один вариант кода VBA Excel для случаев, когда неизвестно, открыта книга или нет. Здесь просто осуществляется попытка открыть книгу, и она будет открыта, если в ячейке содержится ее полное имя, включая диск и подкаталоги. В случае возникновения ошибки, управление будет передано следующей строке.

Sub Primer3()

Dim s1 As String, s2 As String, n1 As Long, n2 As Long

    ‘записываем ссылку из ячейки Лист6!A1 в переменную s1

    s1 = ThisWorkbook.Sheets(«Лист6»).Range(«A1»).Formula

    ‘вырезаем полное имя книги из ссылки и записываем в переменную s2

    On Error Resume Next

    n1 = InStr(s1, «:») — 1

    n2 = InStrRev(s1, «]«)

    s2 = Mid(s1, n1, n2 — n1)

    s2 = Replace(s2, «[«, ««)

    ‘пробуем открыть книгу, если она не открыта

    Workbooks.Open (s2)

    On Error GoTo 0

    ‘копируем ячейки из другой книги в текущую

    Range(s1).Resize(3, 3).Copy ThisWorkbook.Sheets(«Лист6«).Range(«A2:C4«)

End Sub

Переход к ячейке по адресу из формулы рабочего листа в пределах одной книги смотрите в следующей статье.


Mio Mio

0 / 0 / 0

Регистрация: 13.12.2015

Сообщений: 10

1

Как присвоить значения ячейке с другого листа

28.05.2016, 22:55. Показов 9962. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте! Как присвоить значения ячейки с одного листа ячейке с другого листа?
Не знаю как правильно это сделать, до этого всегда присваивала значения разным ячейкам с одного и того же листа таким кодом:

Visual Basic
1
2
3
4
5
6
Sheets("Поставка товара").Select
i = 2
 Do While Cells(i, 3) <> Empty
Cells(i, 5) = Cells(i, 3)
i = i + 1
 Loop



0



kalbasiatka

414 / 262 / 82

Регистрация: 27.10.2012

Сообщений: 860

28.05.2016, 23:52

2

Лучший ответ Сообщение было отмечено Mio Mio как решение

Решение

Visual Basic
1
2
3
4
5
6
7
With Sheets("Поставка товара")
    i = 2
    Do While .Cells(i, 3) <> Empty
        .Cells(i, 5) = Sheets("Другой лист").Cells(i, 3)
        i = i + 1
    Loop
End With



1



0 / 0 / 0

Регистрация: 13.12.2015

Сообщений: 10

29.05.2016, 00:44

 [ТС]

3

kalbasiatka, Спасибо! Работает!



0



Понравилась статья? Поделить с друзьями:
  • Vba excel значение ячейки как текст
  • Vba excel запрос на обновление
  • Vba excel запрос к запросу
  • Vba excel запрос значения
  • Vba excel запрос ввода данных