2015-05-06 5 views
-1

Я написал функцию, которая запрашивает базу данных для определенных записей, и что мне нужно сделать, это отфильтровать результаты. Я решил, что самым простым способом было бы использовать метод .Find в диапазоне и установить стиль ячеек, а затем фильтровать на основе стиля. Проблема, которую я испытываю, заключается в том, что я не могу применить какое-либо преобразование в ячейки по какой-то причине. Однако я могу прочитать значение результата .Find. Как изменить стиль?(VBA Excel) Настройка стиля для результата .Find() не работает

Public Function WoRecR(workOrders As Range) 
    Dim cell As Range 
    Dim cn As Object 
    Dim command As Object 
    Dim results As Object 
    Dim searchResult As Range 
    Dim field As Object 
    Dim criteria As String 

    Set cn = New ADODB.Connection 
    Set command = New ADODB.command 
    Set results = New ADODB.Recordset 
    criteria = "" 

    For Each cell In workOrders 
     If (Not IsEmpty(cell.Value)) Then 
      criteria = "DOCINDEX1='" & cell.Value & "' OR " & criteria 
     End If 
    Next cell 
    criteria = "(" & Left(criteria, Len(criteria) - 4) & ") " 
    With cn 
     .ConnectionString = "Provider=SQLOLEDB.1;" & _ 
          "Persist Security Info=True;" & _ 
          "Data Source=*********;" & _ 
          "DATABASE=******;" & _ 
          "UID=******;" & _ 
          "PWD=******;" 
     .Open 
    End With 
    On Error GoTo CloseCon 
    command.ActiveConnection = cn 
    command.CommandText = "SELECT DOCINDEX1 FROM PVDM_DOCS_1_4 WHERE " & criteria & " AND DOCINDEX9!='Phone' " & _ 
          "AND DATEDIFF(YEAR, GETDATE(), DOCINDEX10) > -2;" 
    command.CommandType = adCmdText 
    command.Execute 

    results.ActiveConnection = cn 
    results.Open command 

    While Not results.EOF 
     Set searchResult = workOrders.Find(What:=results.Fields(0).Value) 
     Debug.Print searchResult.Value 
     searchResult.Style = "Good" 
     results.MoveNext 
    Wend 
    cn.Close 

CloseCon: 
    If Err.Number Then Debug.Print Err.Description 
End Function 

Точная часть кода, что я имею в виду это:

  While Not results.EOF 
       Set searchResult = workOrders.Find(What:=results.Fields(0).Value) 
       Debug.Print searchResult.Value 
       searchResult.Style = "Good" 
       results.MoveNext 
      Wend 

ответ

0

Вы уверены, что вы получаете результат .Find()? Попробуйте это, если:

 While Not results.EOF 
      Set searchResult = workOrders.Find(What:=results.Fields(0).Value) 
      If Not searchResult is Nothing then 
       Debug.Print searchResult.Value 
       searchResult.Style = "Good" 
      Else 
       MsgBox ("nothing found") 'for debugging purposes only 
      End If 
      results.MoveNext 
     Wend 
+0

Абсолютно положительный. Странно то, что я могу установить стиль в обычный Subs, но кажется, что он не работает в пользовательских функциях. Я попытался ввести Range («B2: B10»). Найти (361656) .Style = «Хорошо» в моей функции и в новом макросе. Он работал только в новом макросе. Похоже, что Range заблокирован для редактирования. – haosmark

+0

Вы говорите, что если вы объявите 'Public Sub WoRecR (workOrders As Range)', он будет работать, но если вы объявите 'Public Function WoRecR (workOrders As Range)' это не так? В таком случае я бы изменил его на 'Sub', так как вы ничего не возвращаете из своей функции. Кроме того, я считаю, что существует какое-то ограничение на то, что можно изменить в 'Function' vs' Sub'. – FreeMan

+0

Я хочу, чтобы иметь возможность вызвать это как функцию электронной таблицы, поэтому она настроена таким образом. У вас есть ссылка на эти ограничения? Или есть работа вокруг? – haosmark

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