denis76 Пользователь Сообщений: 22 |
Имеется следующий фрагмент: h = Sheets(«дд»).Range(«A62000»).End(xlUp).Row Собственно говоря, необходимо присвоить в переменную значения некоторого диапазона с другого листа. Почему-то на 2 строке выдает ошибку «Run-time error 1004» |
ber$erk Пользователь Сообщений: 2735 |
#2 19.02.2013 11:08:13
Учимся сами и помогаем другим… |
||
Kuzmich Пользователь Сообщений: 7998 |
#3 19.02.2013 11:18:51 Попробуйте так
|
||
denis76 Пользователь Сообщений: 22 |
Тоже самое, на 2-й строке ошибка выдается… |
denis76 Пользователь Сообщений: 22 |
dx01 = Sheets(«дд»;).Range(«A2»;).Resize(h — 1, 2).Value ber$erk, так — да, работает… Спасибо… Все равно вопрос-то остается в причине ошибки, т.к не особенно понятно, откуда она возникает-то… |
Kuzmich Пользователь Сообщений: 7998 |
Файл приложите в формате .xls |
ber$erk Пользователь Сообщений: 2735 |
#7 19.02.2013 12:07:07
Меня смущает, что код Кузьмича выдает у Вас ошибку, а он ее выдавать не должен (у меня его код отрабатывает нормально). А по поводу ситуации в целом:
Cells(2, 1) и Cells(h, 2) ссылаются на ячейки другого (отличного от «дд») листа. Поэтому и вылезает ошибка пока напрямую не указать нужный лист (ну или не перейти на него). Учимся сами и помогаем другим… |
||||
denis76 Пользователь Сообщений: 22 |
#8 19.02.2013 13:12:53
Ну как бы мне кажется, что мы тут ведь и пишем явным образом указание на нужный лист — Насчет вставить файл — не знаю, как его сюда вставлять, но если отбросить ненужное, суть его такая: Sub p40() hd = Sheets(«дд»).Cells(62000, 1).End(xlUp).Row End Sub ну и запускаем, находясь на другом листе… и пишет ошибку… Resize работает нормально… |
||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#9 19.02.2013 13:19:49
А что тут непонятного? См. файл. Прикрепленные файлы
|
||
Alex K Пользователь Сообщений: 26 |
denis76, из своего опыта могу сказать, что многие свойства и методы объекта Range (например, Find) не работают, если лист не является активным. IMHO это следует воспринимать как данность и при обращениях к Range сначала использовать Sheets(имя листа).Select или Activate. |
ber$erk Пользователь Сообщений: 2735 |
#11 19.02.2013 13:30:25
явно Вы указываете только Sheets(«дд»).Range, а вот Cells(2, 1) и Cells(h, 2) это уже ячейки ТЕКУЩЕГО листа. т.е. явно заданное будет выгляеть так:
Учимся сами и помогаем другим… |
||||
Alex K Пользователь Сообщений: 26 |
Пример. А вот такой будет работать: |
Hugo Пользователь Сообщений: 23251 |
Не нужны для Find Select’ы: Sub tt() |
denis76 Пользователь Сообщений: 22 |
#14 19.02.2013 14:09:06
Понятно… хотя на мой взгляд нелогично это… да и то, что With даже не помогает…
Всем спасибо за пояснения… |
||||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#15 19.02.2013 14:16:38
Поможет, если код не в модуле листа. Иначе всё равно придётся указывать для каждой ячейки ещё и лист. |
||
denis76 Пользователь Сообщений: 22 |
Код кстати не в модуле листа, в обычном модуле… |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#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?
asked Nov 10, 2010 at 20:29
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 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
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 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
answered May 11, 2015 at 6:33
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
12.1k11 gold badges66 silver badges75 bronze badges
answered Jun 20, 2017 at 13:20
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
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
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 Метки нет (Все метки)
Здравствуйте! Как присвоить значения ячейки с одного листа ячейке с другого листа?
0 |
kalbasiatka 414 / 262 / 82 Регистрация: 27.10.2012 Сообщений: 860 |
||||
28.05.2016, 23:52 |
2 |
|||
Сообщение было отмечено Mio Mio как решение Решение
1 |
0 / 0 / 0 Регистрация: 13.12.2015 Сообщений: 10 |
|
29.05.2016, 00:44 [ТС] |
3 |
kalbasiatka, Спасибо! Работает!
0 |