Я новичок в Excel VBA и столкнулся с препятствием. Я не получаю никаких ошибок, когда запускаю это, и я не уверен, с чего даже начать...
Я хотел бы выполнить поиск в столбце C, и если есть непустое значение, скопируйте это значение в столбцы (D, G, I) того же рабочего листа. Я бы начал поиск в строке 4.
Я попытался выполнить код и почти уверен, что моя ошибка связана с currVal = ws.Cells(i, "c"). Когда я прохожу, на листе excel ничего не происходит (ячейки не копируются и не вставляются).
Любая помощь ОЧЕНЬ приветствуется! Я смотрю на это все утро.
Sub Copy()
Dim lastC As Integer
Dim i As Integer
Dim j As Integer
Dim currVal As String
Dim ws As Worksheet
Set ws = ActiveSheet
lastC = ws.Cells(Rows.Count, 1).End(xlUp).Row
For i = 4 To lastC
currVal = ws.Cells(i, "c")
If ws.Cells(i, 1).Value <> "" Then
currVal = ws.Cells(i, "D")
currVal = ws.Cells(i, "G")
currVal = ws.Cells(i, "I")
End If
Next i
End Sub
На самом деле ничего не происходит (по крайней мере, то, что я вижу) и без ошибок, что дает мне место для начала поиска!
Ожидаемые результаты будут копировать это в 3 дополнительных столбца. В результате получается настоящая формула. Формула - это то, что мне нужно скопировать.
27.05.2019 9:39 --- стоимость
='15_2019-02_003.CSV'!$A$2 -- формула
Я обратился к обновлению формулы и удалению ссылок на CSV-файл после извлечения значения из исходного CSV-файла. Этот код предназначен только для поиска пробелов и копирования/вставки.Изображение Excel WS
Это lastC = ws.Cells(Rows.Count, 1).End(xlUp).Row
, если вы не соответствуете требованиям Rows.Count
, это автоматически будет ActiveSheet.Rows.Count
... в этом случае может не иметь никакого значения, но имейте в виду на будущее, это должно быть lastC = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
О, спасибо за быстрый ответ. Когда я меняю это, макрос запускается!! Ура, первый раз запускаю. Но теперь он удаляет то, что находится в столбце C, и ничего не копируется?
Ты тоже поменял currVal = ws.Cells(i, "c")
? Это было хорошо... только остальные 3, где вы хотите записать значение обратно в ячейки, должны быть cell = value
, а не value = cell
.
Вы спасатель! Да, это именно то, что я сделал неправильно! Большое спасибо за помощь! ;)
Добавляя к комментариям, вот как я написал бы этот конкретный код, может быть, это поможет:
Sub Copy()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim lastC As Long: lastC = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim R As Long 'I like to use R (rows) & C (cols), just because makes it more readable (for me)
For R = 4 To lastC
With ws
If .Cells(R, "A").Value <> "" Then
.Cells(R, "D") = .Cells(R, "C").Value
.Cells(R, "G") = .Cells(R, "C").Value
.Cells(R, "I") = .Cells(R, "C").Value
End If
End With
Next R
End Sub
PS: я предпочитаю цифры вместо букв для ссылки .Cells
, но в этом случае понятно использовать букву. Просто для лучшей практики - с точки зрения удобочитаемости, не следует их смешивать.
а если нужно было вставить формулы? есть ли простой способ xlpaste.formulas? И мне действительно нравится R для строк, в этом гораздо больше смысла! Спасибо за вашу помощь в этом.
Вы можете использовать range.Value
для значений, range.formula
для формул и т. д.
Вы выделяете значение из этих ячеек в переменную... я думаю, вы должны сделать это наоборот, то есть:
ws.Cells(i, "D").value = currVal