Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] [Excel] Присвоение значения ячейке

Ответить
Настройки темы
VBA - [решено] [Excel] Присвоение значения ячейке

Старожил


Сообщения: 197
Благодарности: 51


Конфигурация

Профиль | Отправить PM | Цитировать


Добрый день!
Необходимо в определенные ячеки листа внести определенные формулы из скрипта.
Делаю так:
Код: Выделить весь код
    Dim sheetWithKvit As Worksheet
    Set sheetWithKvit = Worksheets("Лист1")

    Do While True ' Not IsNull(Sheets("Лист2").Range("A" + Str(curRow)))
        text = "=Лист2!G" + Str(curRow)
        sheetWithKvit.Cells(curRowInKvit, curCollumnInKvit).Value = text
На последней приведенной строке возникает 1004 ошибка "Application-defined or object-defined error". Пробовал разные вариации на тему, но получается та же ошибка.
Как реализовать банальнейшее присвоение значения ячейке???

Понимаю, что задача банальна, но как ни смешно, не могу понять как это закодировать.

Отправлено: 14:39, 09-03-2012

 

Ветеран


Contributor


Сообщения: 24953
Благодарности: 7249

Профиль | Отправить PM | Цитировать


Цитата PhilB:
На последней приведенной строке возникает 1004 ошибка "Application-defined or object-defined error". Пробовал разные вариации на тему, но получается та же ошибка. »
PhilB, недостаточно приведённых данных для ответа.

Цитата PhilB:
Как реализовать банальнейшее присвоение значения ячейке??? »
Именно так, как у Вас написано. Но Вы хотите присвоить ячейке не значение, а формулу. Соответственно, Вы должны использовать не свойство «.Value», а свойства .Formula/.FormulaLocal или .FormulaR1C1/.FormulaR1C1Local.

Using Microsoft Excel Worksheet Functions in Visual Basic [Excel 2003 VBA Language Reference]:
Цитата:

Inserting a Worksheet Function into a Cell

To insert a worksheet function into a cell, you specify the function as the value of the Formula property of the corresponding Range object. In the following example, the RAND worksheet function (which generates a random number) is assigned to the Formula property of range A1:B3 on Sheet1 in the active workbook.
Код: Выделить весь код
Sub InsertFormula()
    Worksheets("Sheet1").Range("A1:B3").Formula = "=RAND()"
End Sub
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:50, 09-03-2012 | #2



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

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


Старожил


Сообщения: 197
Благодарности: 51

Профиль | Отправить PM | Цитировать


Так работает:
Код: Выделить весь код
Worksheets("Лист1").Cells(curRowInKvit, curCollumnInKvit).FormulaR1C1 = "=Лист2!G"
Так не работает (а хотелось бы ):
Код: Выделить весь код
Worksheets("Лист1").Cells(curRowInKvit, curCollumnInKvit).FormulaR1C1 = "=Лист2!G" + Str(curRow)
Вариант с .Formula тоже пробовал. Проблема та же.

Суть задачи в том, что необходимость реализовать именно динамическую сборку формул. Но не могу понять как.

P.S. Это реализуется мной в Office 2003

Последний раз редактировалось PhilB, 09-03-2012 в 21:59.


Отправлено: 21:48, 09-03-2012 | #3


Ветеран


Contributor


Сообщения: 24953
Благодарности: 7249

Профиль | Отправить PM | Цитировать


PhilB, я уже говорил выше:
Цитата Iska:
…недостаточно приведённых данных для ответа. »
Приведите весь код.

Отправлено: 00:02, 10-03-2012 | #4


Старожил


Сообщения: 197
Благодарности: 51

Профиль | Отправить PM | Цитировать


Суть задачи:
Есть view в БД MS Access. И шаблон квитанции в Excel. Суть задачи: получить данные из БД, и не основе шаблона сгенерировать квитанции, подставив туда соответсвующие данные. То есть получается по сути операция типа слияние в word. В excel подобного я не нашел, посему пишу скрипт.
Весь код:
Код: Выделить весь код
Sub Макрос2()

    ' Скопировать лист
    Sheets("Лист1").Copy

    ' Костыль: вручную скопировать одну из ячеек, т.к. ее длина превышает 255 символов
    Windows("Квитанция ШАБЛОН.xls").Activate
    Range("B6").Select
    Selection.Copy
    
    ' Костыль: вручную вставить одну из ячеек, т.к. ее длина превышает 255 символов
    Windows(Windows.Count).Activate
    Range("B6").Select
    ActiveSheet.Paste
    Range("D6").Select
    ActiveSheet.Paste
    Range("D12").Select
    ActiveSheet.Paste
    Range("B12").Select
    ActiveSheet.Paste
    
    ' Добавить источник данных
    Sheets.Add
    Application.CutCopyMode = False
    With ActiveSheet.QueryTables.Add(Connection:=Array( _
        "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=X:\Work\Юлька\Клиенты.mdb;Mode=Read;Extended Properties=""" _
        , _
        """;Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Datab" _
        , _
        "ase Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";J" _
        , _
        "et OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Co" _
        , "mpact Without Replica Repair=False;Jet OLEDB:SFP=False"), Destination:= _
        Range("A1"))
        .CommandType = xlCmdTable
        .CommandText = Array("Квитанция")
        .Name = "Клиенты"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceDataFile = "X:\Work\Юлька\Клиенты.mdb"
        .Refresh BackgroundQuery:=False
    End With
    
    ' Подготовка к вставке ссылок листа с квитанциями на ячейки с данными
    'Sheets("Лист1").Select
    
    Dim text As String
    
    Dim collumnsInKvit As Integer
    collumnsInKvit = 17
    
    Dim kvitNum As Integer
    kvitNum = 1
    
    Dim curRow As Integer
    curRow = 2
    
    Dim curRowInKvit As Integer
    curRowInKvit = 2
    Dim curCollumnInKvit As Integer
    curCollumnInKvit = 1 ' "A"
    Dim curSecondCollumnInKvit As Integer
    curSecondCollumnInKvit = 2 ' "B"
    
    Dim sheetWithKvit As Worksheet
    Set sheetWithKvit = Worksheets("Лист1")

    Do While IsNull(Worksheets("Лист1").Range("A" + Str(curRow)))
        ' Sheets("Лист1").Select
        'Sheets("Лист1").Activate
                
        ' Платеж
        Dim a As Object
        Worksheets("Лист1").Cells(curRowInKvit, curCollumnInKvit).FormulaR1C1 = "=Лист2!G" + Str(curRow)
        
        ' Долг
        text = "=Лист2!H" + Str(curRow)
        Range(curSecondCollumnInKvit + Str(curRowInKvit)).Value = text
        
        ' Адрес
        text = "=Лист2!C" + Str(curRow)
        Range(curSecondCollumnInKvit + Str(curRowInKvit + 1)).Value = text
        
        ' Код плательщика
        text = "=Лист2!F" + Str(curRow)
        Range(curCollumnInKvit + Str(curRowInKvit + 2)).Value = text
        
        ' ФИО
        text = "=Лист2!D" + Str(curRow)
        Range(curSecondCollumnInKvit + Str(curRowInKvit + 2)).Value = text
        
        ' Добавление страницы
        If kvitNum Mod 2 = 0 Then
            Range("A" + Str(curRowInKvit) + ":D" + Str(curRowInKvit + collumnsInKvit)).Copy
            Range("A" + Str(curRowInKvit + collumnsInKvit)).Select
            ActiveSheet.Paste
            ActiveSheet.PageSetup.PrintArea = "$A$1:$D$" + Str(curRowInKvit + collumnsInKvit)
        End If
        
        ' Переход к следующей квитанции
        If kvitNum Mod 2 = 1 Then
            curCollumnInKvit = 3 '"C"
            curSecondCollumnInKvit = 4 '"D"
        Else
            curCollumnInKvit = 1 ' "A"
            curSecondCollumnInKvit = 2 '"B"
        End If
        curRowInKvit = curRowInKvit + collumnsInKvit
        curRow = curRow + 1
        
        ' Sheets("Лист2").Select
        Sheets("Лист2").Activate
                        
    Loop

End Sub
]
Лист копирую, т.к. при копировании диапазона, почему-то не сохраняется форматирование. Вообще, оно какое-то мутное. Видимо, надо и книгу указывать, а не только лист, но она создается кодом Sheets("Лист1").Copy, и как получить имя книги не ясно.
Толковой книги так и не нашел . Натолкните на ошибку, пожалуста.
Iska, спасибо за внимание.

Последний раз редактировалось PhilB, 10-03-2012 в 18:25.


Отправлено: 17:46, 10-03-2012 | #5


Ветеран


Contributor


Сообщения: 24953
Благодарности: 7249

Профиль | Отправить PM | Цитировать


К сожалению, чтобы воспроизвести ошибку — мне понадобятся все Ваши данные. Так что, сие, скорее всего, отпадает.

Цитата PhilB:
Так не работает (а хотелось бы ):
Код: Выделить весь код
Worksheets("Лист1").Cells(curRowInKvit, curCollumnInKvit).FormulaR1C1 = "=Лист2!G" + Str(curRow)
»
«.FormulaR1C1()» предусматривает задание адреса в стиле «R1C1», наподобие «=Лист2!R[7]C[1]».

Цитата PhilB:
Вариант с .Formula тоже пробовал. Проблема та же. »
Попробуйте данную строку ещё в таком виде:
Код: Выделить весь код
Worksheets("Лист1").Cells(curRowInKvit, curCollumnInKvit).Formula = "=Лист2!G" & СStr(curRow)
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:12, 10-03-2012 | #6


Старожил


Сообщения: 197
Благодарности: 51

Профиль | Отправить PM | Цитировать


Да, после замены фукнции Str на CStr все заработало как надо.
Следующая конструкция оказалась рабочей:
Код: Выделить весь код
Cells(curRowInKvit, curCollumnInKvit).Formula = "=Лист2!G" + СStr(curRow)
Iska, благодарю за помощь!

Отправлено: 22:43, 11-03-2012 | #7


Ветеран


Contributor


Сообщения: 24953
Благодарности: 7249

Профиль | Отправить PM | Цитировать


PhilB, напомню ещё, на всякий случай, про разницу в свойствах «.Formula»/«.FormulaLocal»: если у Вас локализованная версия, и Вы будете использовать в ячейках формулы рабочего листа (например, «СУММ()»/«SUM()»), то свойство «.Formula» ожидает увидеть в текстовой строке присвоения свойства англоязычные наименования формул рабочего листа — например, «SUM()», а свойство «.FormulaLocal» — соответственно, локализованные наименования формул рабочего листа, в данном случае — «СУММ()».
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:22, 12-03-2012 | #8


Аватара для Евгений_Косьяненко@fb

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Не могу снять сумму с массива данных, ибо некоторые из этих данных по условию ложны. Не могу дать нулевое значение ложной переменной.
Я, честное слово, не умею на вашем языке разговаривать.
Но, если я пытаюсь научить ячейку показывать ноль, при ложном значении, но, числовое значение, при истинном, то возникает цикличность, формула не работает. Это никак не обойти?

Отправлено: 06:17, 08-06-2013 | #9


Ветеран


Contributor


Сообщения: 24953
Благодарности: 7249

Профиль | Отправить PM | Цитировать


Евгений_Косьяненко@fb, выложите Вашу рабочую книгу. Укажите диапазон массива.

Отправлено: 11:25, 08-06-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] [Excel] Присвоение значения ячейке

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - Excel - Сложить значения определенных ячеек ALaN_1 Microsoft Office (Word, Excel, Outlook и т.д.) 1 31-10-2011 22:22
2003/XP/2000 - MS Excel | Отделить данные разного характера в одной ячейке Rubichek Microsoft Office (Word, Excel, Outlook и т.д.) 2 26-04-2011 18:56
2003/XP/2000 - Excel | Пустые значения в ряду данных графика AlexM Microsoft Office (Word, Excel, Outlook и т.д.) 0 06-02-2010 07:17
[решено] Использование функций VBa в ячейке Excel. pingUIN Хочу все знать 1 04-12-2009 15:59
C/C++ - Присвоение функции значения mrcnn Программирование и базы данных 4 07-11-2008 08:26




 
Переход