2015-03-10 2 views
0

У меня есть таблица с семью столбцами, содержащие даты. Каждый столбец имеет даты, которые назначаются с использованием другой формулы для каждого столбца. Моя конечная цель - сравнить даты с сегодняшним днем, и если в течение определенного промежутка времени, чтобы запустить электронную почту, а затем обновить дату. Моя проблема, прежде всего, пытается взять каждую строку и пропустить каждый из столбцов. Я колоть в темноте при этом, пытаясьЦикл через каждый столбец в строке по имени в таблице

Dim ColWeekly, ColBiWeekly, ColMonthly, ColThMonth, _ 
ColSxMonth, ColYearly, ColBiYearly As Range 
Dim ColVar As Variant 
Dim PMTime As Long 
Set ColWeekly = Range("PM[Weekly]") 

For Each Row In [PM].Rows 
    For Each Column In [PM].Columns 
    Set ColVar = Column.Name 
    Select Case ColVar 

    Case ColWeekly 
     If Date - Cell.Value = 1 Then 
     Call Email 
     Set Cell.Value = TODAY + 8 
     End If 

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

ответ

0

Если строка заголовков статична, а ваш набор данных невелик (если вы хотите отправлять электронные письма, я предполагаю, что это так), вы можете использовать метод проверки.
В моем примере заголовок s были в строка 5 и я использовал Как аргумент.

For i = 6 To LastRow 
    For j = 1 To LastColumn 
     Select Case True 
      Case CStr(Cells(5, j).Value2) Like "*megjegyzés*" 'megjegyzések sortöréseinek eltüntetése 
       Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbLf, "") 
       Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbCr, "") 
       Cells(i, j).Value = Trim(CStr(Cells(i, j).Value2)) 
      Case CStr(Cells(5, j).Value2) Like "*Tárgy*" 
       Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbLf, "") 
       Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbCr, "") 
       Cells(i, j).Value = Trim(CStr(Cells(i, j).Value2)) 
      Case CStr(Cells(5, j).Value2) Like "*Kiállítás*" 'dátumok formátumváltása 
       Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value)) 
       Cells(i, j).NumberFormat = "General" 
      Case CStr(Cells(5, j).Value2) Like "*Esedékes*" 
       Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value)) 
       Cells(i, j).NumberFormat = "General" 
      Case CStr(Cells(5, j).Value2) Like "*Teljesítés*" 
       Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value)) 
       Cells(i, j).NumberFormat = "General" 
     End Select 
    Next 
Next 
+0

Это будет между 100-150 строк, но я не рассматривал этот подход. Я собираюсь попробовать и посмотреть, как это происходит. Благодаря! @ user3819867 – Austin

+0

В итоге я использовал комбинацию обоих этих методов, чтобы получить желаемый результат. Спасибо за помощь! – Austin

1

В вашем примере имеется ряд проблем. Я не буду исправлять их без подробностей о формате вашей книги.

Вместо этого я приведу простой пример того, как правильно использовать Select Case и выполнить простое сравнение столбцов. Назначьте имя диапазона Weekly и Monthly где-нибудь в столбцах A:C, чтобы использовать этот пример.

Option Explicit 
Public Sub IterateThroughColumns() 
    ' Create some variables 
    Dim col As Range, colWeekly As Long, colMonthly As Long 

    ' Assigns the column number for each range 
    colWeekly = Range("Weekly").Column 
    colMonthly = Range("Monthly").Column 

    For Each col In Sheet1.Range("A:C").Columns 
     Select Case col.Column 
      Case colWeekly 
       MsgBox "Found Weekly range in column " & col.Column 
      Case colMonthly 
       MsgBox "Found Monthly range in column " & col.Column 
      Case Else 
       MsgBox "No range was found in column " & col.Column 
     End Select 
    Next 
End Sub 

Это должно дать вам представление о том, как создать простой For Each цикл для перебора столбцов, но сравнивать по номеру столбца, а не сравнивая диапазон объектов напрямую.

+0

Эй, спасибо за ответ! Имеет ли значение, что все это устроено в таблице? С заголовками столбцов как еженедельно, ежемесячно и т. Д.? @grovesNL – Austin

+0

Если это именованный диапазон (который равен ширине столбца), то нет, это не имеет значения. – user3819867

Смежные вопросы