Как Excel Add-In может ответить на события в каком-либо рабочем листе?

Что я делаю не так?

Во второй попытке вы правильно поняли, что проблема не требует вложенных циклов, но read line < blocks.log неверно, потому что это читает только первая строка неоднократно. Вот исправленная версия с некоторыми замечаниями:

line='' # no line read yet
for i in $wallets; do
    current_blocks=`$i getblockcount`
    coin_name=`basename $i -cli`    # I just prefer it more readable.
    if [ ! "$line" ]; then          # we need to read a line from log
        read line
        set -- $line
    fi
    if [ "$1" == "$coin_name" ]; then
        line='' # read new line next time
        echo "File contains the coin_name, compare the blocks now"
        if (( current_blocks > $2 )); then
            echo "Current blocks are greater than the saved blocks"
            echo "Saving the new blocks count now"
            sed -i "/$1/c$1 $current_blocks" blocks.log
        else
            echo "Current blocks are less than or equal to saved blocks"
        fi
    else
        # $line as well as $1 and $2 remain set, will be used in next loop cycle
        echo "File does not contain the coin_name, adding it now"
        if [ ! "$1" ]; then         # $1 is empty at EOF
            # create a new blocks.log to not disturb reading from original:
            cp blocks.log $; mv $ blocks.log
            echo "$coin_name $current_blocks" >>blocks.log
        else
            # insert before current line (address /$1/)
            sed -i "/$1/i$coin_name $current_blocks" blocks.log
        fi
    fi
done <blocks.log

Обычно мы читаем по одной строке из журнала для каждого кошелька по порядку, таким образом, у нас есть один for i in $wallets цикл с одним read line внутри. Но есть случай, когда со времени последнего скрипта запускается новый накопленный кошелек, которого нет в файле; здесь мы уже прочитали следующую строку кошелька из файла журнала, поэтому мы сохраняем данные этой строки для следующего цикла цикла и не читаем новую строку.

Другим важным моментом является то, что мы не должны изменять файл blocks.log входного во время выполнения цикла - это добавит новые данные к старым данным, смешивая овец и коз. К счастью, sed -i создает новый файл blocks.log output , в то время как старый файл input остается анонимным и без изменений. Только когда мы echo … >>blocks.log, мы сами должны обеспечить создание нового blocks.log.

Обратите внимание, что этот подход требует сортировки кошельков; поскольку все ваши -cli файлы находятся в каталоге /usr/local/bin/, вы можете написать wallets=/usr/local/bin/*-cli вместо строки с find.

8
задан lfrandom 6 August 2013 в 20:32
поделиться

1 ответ

Не используйте ключевое слово New в операторе dim. Вы говорите ему создать экземпляр класса, когда это необходимо, но тогда вы никогда не обратитесь к нему снова, поэтому он никогда не понадобится. Вместо этого:

Public MySheetHandler As SheetChangeHandler

Sub Auto_Open
   Set MySheetHandler = New SheetChangeHandler
End Sub

Эта строка в Auto_Open (которая запускается при запуске) создаст экземпляр класса.

8
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: