В вашем коде есть две основные ошибки - плюс небольшая. Один из них структурный. Вы объявляете не те переменные, которые используете. Это все равно, что сказать: «Поскольку я не знаю, как водить машину, я мог бы с таким же успехом закрыть глаза, как мы несемся вперед». Это не без логики c, но мало что дает для того, чтобы вы туда, куда вы хотите go.
Другое дело в путанице между функцией рабочего листа, которую вы хотите выполнить VBA, и той, которую вы используете. sh назначить ячейку для выполнения в Excel. Записать сложную формулу в ячейку сложнее, чем заставить VBA вычислить сложную формулу. Для метода, если вы хотите создать формулу в VBA, вы должны сначала присвоить ее строке, например MyFormula = "=COUNTIF(D6:D12, "MyName")"
, а затем, после тестирования, присвоить эту строку свойству Formula
ячейки, например Cells(R, ClmName).Formula = MyFormula"
. В приведенном ниже коде я выбрал VBA для расчета. Поскольку не совсем ясно, что вы хотите (неисправный код никогда не является хорошим способом показать, что вы собираетесь!), Пожалуйста, измените его. В VBA это проще, чем в функции рабочего листа.
Private Sub Test()
Dim LastRow As Long
Dim LastClm As Long
Dim ClmName As Long ' R use "col" for color, "clm" for column
Dim ClmSampleText As Long
Dim CountRng As Range
Dim Output As Variant
Dim R As Long ' R use R for row, C for column
Sheets("Data").Activate
LastRow = Sheets("Data").Range("b5000").End(xlUp).Row
' this is still assuming that row 5 has the header in it
LastClm = Sheets("Data").Cells(5, Columns.Count).End(xlToLeft).Column
' this can be repeated for any other columns we want to asign values to.
' These variables will make the rest of this much easier
ClmName = Rows(5).Find("Name", LookAt:=xlWhole).Column
ClmSampleText = Rows(5).Find("Sample Text", LookAt:=xlWhole).Column
For R = 6 To LastRow
'this should find the unique identifying infomation for each sample and analyte
Set CountRng = Range(Cells(6, ClmName), Cells(R, ClmName))
Output = WorksheetFunction.CountIf(CountRng, Cells(R, ClmName).Value)
If Output < 10 Then Output = 0
Cells(R, 1).Value = CStr(Output) & "-" & Left(Cells(R, ClmSampleText).Value, 5)
Next R
End Sub
"Незначительная" ошибка связана с отсутствием понимания объекта Cell
. Ячейка Range
. Он имеет много свойств, таких как Cell.Row
и Cell.Column
или Cell.Address
, и других свойств, таких как Cell.Value
или Cell.Formula
. Свойство Value является значением по умолчанию. Поэтому Cell
совпадает с Cell.Value
НО не всегда. В этом примере, не думая о Cell.Value
, вы также пропустили Cell.Formula
и, поместив Cell
в WorksheetFunction
, вы перепутали VBA с тем, что вы имели в виду: Cell the Value или Cell the Range. При том, что все участники смущены, результат был предсказуем
Рекомендуется всегда писать Cell.Value
, когда вы имеете в виду значение ячейки, и использовать только Cell
, только если вы имеете в виду диапазон.