#excel #vba #loops #for-loop #matrix
#excel #vba #циклы #для цикла #матрица
Вопрос:
Я пытался использовать код, найденный в другой книге, чтобы соответствовать моей ситуации, но при запуске он не возвращает значений. Был бы признателен за любую информацию о том, как это исправить.
ЦЕЛЬ: построить матрицу, которая показывает каждую меру и помечает «X» для используемых измерений.
Col A на листе МАТРИЦЫ содержит список мер. Последующие столбцы (Col B, C и т. Д.) — Это Все измерения.
Col A в листе FTD также представляет собой список мер, но они повторяются. Col B — это список соответствующих измерений для каждой меры. (то же, что и имена столбцов в листе МАТРИЦЫ)
Цель состоит в том, чтобы сопоставить показатели в Col A, листе МАТРИЦЫ с> Col A, листе FTD. Если они найдены на листе FTD, он должен проверить соответствующее измерение для этой меры, найти его в столбцах на листе МАТРИЦЫ и отметить «X» под соответствующим столбцом.
Примечание: размеры на обоих листах имеют одинаковый тип / формат и т. Д. (они оба получены из одного и того же источника)
Matrix Sheet:
COL A DIMENSION A(Cost) DIMENSION B(Hours Worked) Hours Forecast Accounts Receivable Location
Measure 1 x x x
Measure 2 x x
Measure 3 x
Measure 4 x x x
FTD Sheet:
COL A COL B
Measure 1 DIMENSION A(Cost)
Measure 1 Hours Worked
Measure 1 Hours Forecast
Measure 2 Accounts Receivable
Measure 2 Location
Measure 3 Location
Код ниже:
Public Sub ltdsol()
Set sht = Worksheets("Matrix")
Set sht2 = Worksheets("FTD")
MATRIXLastRow = sht.Cells(sht.Rows.Count, 1).End(xlUp).Row
FTDLastrow = sht2.Cells(sht2.Rows.Count, 1).End(xlUp).Row
For i = 2 To MATRIXLastRow
' Find the row with a matching Case ID/Client Name
For k = 2 To FTDLastrow
If sht.Cells(k, 1).Value = sht2.Cells(i, 1).Value Then _
Exit For
Next
q = 3 ' Starting column for Questions, look for a matching question/header (or blank)
Do Until sht2.Cells(1, q).Value = sht.Cells(i, 3).Value Or sht2.Cells(1, q).Value = vbNullString
q = q 1
Loop
' Write the Response
sht2.Cells(k, q).Value = "X"
Next
End Sub
Был бы признателен за любую помощь. Спасибо.
Комментарии:
1. Это можно сделать с помощью простой формулы:
=IF(COUNTIFS(FTD!$A:$A,$A2,FTD!$B:$B,B$1),"X","")
2. Я попробовал это, и это не сработало. Я не думаю, что это объясняет тот факт, что соответствующие измерения представляют собой заголовки столбцов, переходящие из Col C в CF.
3. Предложение @Scott Craner должно сработать. Проблема не в решении, а в тесте. Я подозреваю, что ваши подписи к столбцам, такие как «Измерение A», не являются истинными представителями реальных данных. Если «Измерение A» будет иметь значение, подобное 3.141592613, решение Скотта не сможет найти 3.1416 в файле FTD. То же самое было бы верно, если бы одно из значений представляло собой текстовую строку с одинаковым номером. Преимущества простоты предложения Скотта должны побудить вас предоставить ему надлежащий тест. В качестве альтернативы, приготовьтесь к сбою любого другого решения по той же причине.
4. Поскольку вы не запрашиваете формулу в своем вопросе, моя формула будет считаться не по теме и открыта для голосования. Я просто оставлю это в качестве комментария. Я рад, что это помогло.
5. Вы можете выполнить index / match2x здесь. Я предполагаю, что ваши таблицы начинаются с ячейки A1.
=index([your source table], match(A2, [source table col A],0), Match(B2, [source table row 1], 0))
В основном это будет использовать ваш ключ в A2 и B2, чтобы найти пересечение в другой таблице и перенести его в ваш лист, не требуется VBA.