Как сохранить формулы и очистить содержимое в Excel с помощью VB.net? - PullRequest
1 голос
/ 02 августа 2011

Цель достижения:

  • У меня есть диапазон данных, которые я хочу заменить новыми данными.

  • Итак, я хочу очистить старые данные и заменить их новыми данными.

  • Но формулы в старых данных также необходимы для работы с новыми данными.

Я сделал следующее:

Private Sub updateData(ByRef sheet As Excel.Worksheet, ByVal dataRow As String, ByRef data As Object)
    Dim range As Excel.Range
    downRange(sheet, dataRow).ClearContents()  // Note this !!
    // Both data and formulas are lost due to this.
    // What shall I use instead of this to retain the formulas in the first row.
    range = sheet.Range(dataRow.Substring(0, dataRow.Length - 1) + (data.GetLength(0) + 1).ToString())
    range.Value2 = data
    // If the 1st row still has the formulas, then I can do AutoFill for this new data.
End Sub

Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String)
    Dim range As Excel.Range
    range = sheet.Range(rangeString)
    range = sheet.Range(range, range.End(Excel.XlDirection.xlDown))
    Return range
End Function

Но проблема в следующем:

  • Формулы теряются. (Очевидно)
  • Я хочу сохранить формулы в первом ряду, чтобы я мог затем выполнить автозаполнение
  • Можете ли вы предложитькакое-нибудь решение?

Демонстрация требуемых результатов:

СТАРЫЕ данные:

  |   A      |  B  |  C  |
1 |   H1     |  H2 |  H3 |
2 |   =B2+C2 |  5  |  9  |   Therefore, A2 = 14
3 |   =B3+C3 |  7  |  2  |   Therefore, A3 = 9

Я хочу заменить данные и сохранить формулы, чтобы (Новые данные):

  |   A      |  B  |  C  |
1 |   H1     |  H2 |  H3 |
2 |   =B2+C2 |  4  |  6  |   Therefore, A2 = 10
3 |   =B3+C3 |  3  |  5  |   Therefore, A3 = 8

И данный вызов был updateData(sheet, "A2:C2", dataFromDB)

Какя могу сохранить формулы, но изменить данные без изменения вызова функции?

Ответы [ 3 ]

1 голос
/ 28 ноября 2012

У меня была похожая проблема, и я использовал эту логику, когда очищал клетки.Приведенный ниже фрагмент очищает ячейки в столбцах AC & F из строк 2-1000, за исключением строки 5. Используйте это, если вы хотите получить штраф за мелкозернистый контроль над тем, что хотите очистить.:

Const clearCells = "A?:C?,F?"

Sub clearCells()
For i = 2 To 1000
If i <> 5 Then
Range(Replace(clearCells, "?", i)).ClearContents
End If
Next i
End Sub

Более простой способ - очистить столбцы AC и F от строк 2-2000:

    Range ("A2:C2000,F2:F2000").ClearContents

Наконец, чтобы переписать программу, вы можете перебрать диапазонсоздайте новый диапазон и добавьте в него ячейки, только если они не имеют такой формулы:

Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String)
Dim inRange As Excel.range
Dim outRange As range
Set inRange = sheet.range(rangeString)
Set inRange = sheet.range(inRange, inRange.End(Excel.XlDirection.xlDown))
Dim r As range
For Each r In inRange
  If Left(r.Formula, 1) <> "=" Then
    If outRange Is Nothing Then
    Set outRange = r
    Else
    Set outRange = Application.Union(outRange, r)
    End If
  End If
Next r
downRange = outRange
End Function
0 голосов
/ 02 августа 2011

Я думаю, что вы почти у цели - похоже, вам просто нужно начать очистку на одну строку сверху вниз.

Предполагая, что у вас есть доступ к методу Range.Offset (у меня нетпростой способ проверить это на Vb.Net, но я не вижу причин, по которым он не должен быть доступен), тогда вы сможете просто сдвинуть начальную ячейку:

Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String)
    Dim range As Excel.Range
    range = sheet.Range(rangeString).Offset(1, 0) // Here's the extra piece
    range = sheet.Range(range, range.End(Excel.XlDirection.xlDown))
    Return range
End Function
0 голосов
/ 02 августа 2011

Если вы хотите сохранить формулы в первой строке, не выбирайте первую строку для удаления. Передайте "A3:F3" в функцию.

Что касается автозаполнения, используйте свойство Range.FormulaR1C1. Считайте FormulaR1C1 из первой ячейки и запишите то же значение в FormulaR1C1 в остальных ячейках.

...