При сбое следующего цикла: сопоставьте значения в Col A (лист 1) с Col A (лист 2), а затем сопоставьте столбцы

#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.