Проблема в том, что вы используете коллекцию Characters
. Если вы хотите покрасить различные слова, найденные, отлично, но сделайте это после того, как вы будете манипулировать всеми строковыми значениями.
Боковое примечание : Повторное использование ActiveSheet меня пугает. Установите это в переменную в начале подпрограммы и используйте вместо нее переменную.
Dim Sheet as Worksheet
Set Sheet = ActiveSheet
.
Sheet.Range(...
.
Set Sheet = nothing
Посмотрите на чтение / запись данных в вариант вместо диапазона. (по крайней мере, для обработки текста) Вот пример загрузки Range в вариант:
Dim vNoiseWords as Variant
vNoiseWords = Sheet.Range("B2", Sheet.Range("B2").End(xlDown)).Value2
Запись просто противоположна (но мне обычно приходится транспонировать массив).
Затем вы можете пройти через массив вариантов и идентифицировать текст, который должен быть окрашен в ячейку.
Свернуть любые и все взаимодействия с листом
... поэтому ограничьте любую строку, которая начинается с ActiveSheet.
, Cell.
, Range.
и обрабатывает ее только в том случае, если это необходимо.
Даже Cell = UCase(Cell)
является огромная трата времени.
. Вам гораздо лучше делать
Value = UCase(Cell.Value2)
If Value <> Cell.Value2 then Cell.Value2 = Value
Обновить
FYI. медленные части вашего кода, добавив временные метки между разделами кода. Вот простая процедура, которую я использую для отслеживания временных интервалов и отображения результатов в непосредственном окне.
Public Sub TimeStamp(Optional Prompt As String, Optional StartTimer As Boolean)
Static s_fTimer As Single, s_fIntervalTimer As Single
Dim fCurrTime As Single
fCurrTime = Timer
If StartTimer Then
s_fTimer = fCurrTime
s_fIntervalTimer = fCurrTime
End If
If Prompt <> vbNullString Then Prompt = " - " & Prompt
Debug.Print Format((fCurrTime - s_fTimer), "0.000s") & Format((fCurrTime - s_fIntervalTimer), "(0.000s)") & Prompt
s_fIntervalTimer = fCurrTime
End Sub
При первом вызове (или в любое время, когда вы хотите сбросить счетчик общего времени ), вы должны установить StartTimer = True
следующим образом:
TimeStamp "Start of Program", True
После этого просто вызовите подпрограмму с дополнительным приглашением для отслеживания разделов кода:
TimeStamp "After Smart Quote Loop"
TimeStamp "The End"
Затем просто посмотрите на промежутки времени, найдите самые большие и уничтожьте их, если не считаете их разумными. Вы обнаружите, что каждое взаимодействие с UI / ячейками - это задержка, но обработка данных в фоновом режиме занимает очень мало времени.
Проблема в том, что количество параметров в операторе SQL не совпадает с количеством предоставленных аргументов. Это не очевидно, глядя на код, но
Object[] obj = new Object[3];
obj[0] = "Duke";
jdbcTemplate.update(sql, obj);
в основном совпадает с
jdbcTemplate.update(sql, new Object[] { "Duke", null, null });
. это то же самое.
Для обработки различного количества аргументов вы можете перейти от массивов к спискам.
В:
sql+= " commodityPricePerKg = ? "
И:
sql+= ", commodityPricePerKg = ? ";
Вы уверены, что ваше поле в БД названо так? Может быть, он называется "commodity_price_per_kg"?