Range.Set
. Это неверно, поэтому я не включил его, когда попытался исправить ваш вопрос, включив в него код из ваших комментариев. .Range
является просто продолжением оператора With wb.Sheets("Open Quote")
; поэтому .Range
фактически означает wb.Sheets("Open Quote").Range
. Когда вы звоните Range
(без .
), вы используете неявную ссылку на активный лист; Поскольку вы только что открыли файл, который вы называете wb
, активный лист в нем теперь активен, а не лист / книга, которая была активна при запуске подпрограммы.
См. Ссылку: избегать неявного кода
Итак, на какой книге / листе должен быть Range(L3)
?
Вы никогда не тестируете, чтобы увидеть if cell is nothing then
или фактически используете cell
где-нибудь в вашем коде после этого.
Всякий раз, когда вы сталкиваетесь с проблемами, вы должны установить точку останова (F9) перед проблемой и использовать F8
для перехода по одной строке за раз.
Вы можете навести курсор мыши на переменные, добавить Watch и / или использовать Debug.Print
для отображения значений в непосредственном окне (Ctrl + G).
Попробуйте,
Debug.Print .Range("L3").Parent & ".Range(" & .Range("L3").Address & ")"
Debug.Print Range("A1:BA350").Parent & ".Range(" & Range("A1:BA350").Address & ")"
Debug.Print cell.Parent & ".Range(" & cell.Address & ")"
Пожалуйста, измените вопрос, включив в него код, который вы используете в настоящее время.
(лучше включить Option Explicit
)
Похож на него, действительно всего один поток на экземпляр CLR в рамках процесса - в данный момент, так или иначе. Вот некоторый код, чтобы показать что:
Test.cs:
using System;
class Test
{
static void Main()
{
AppDomain.CreateDomain("First")
.ExecuteAssembly("ShowFinalizerThread.exe");
AppDomain.CreateDomain("Second")
.ExecuteAssembly("ShowFinalizerThread.exe");
}
}
ShowFinalizerThread.cs:
using System;
using System.Threading;
class ShowFinalizerThread
{
static Random rng = new Random();
~ShowFinalizerThread()
{
Console.WriteLine("Thread/domain: {0}/{1}",
Thread.CurrentThread.ManagedThreadId,
AppDomain.CurrentDomain.FriendlyName);
if (rng.Next(10) == 0)
{
Console.WriteLine("Hanging!");
Thread.Sleep(2000);
}
}
static void Main()
{
new Thread(LoopForever).Start();
}
static void LoopForever()
{
while (true)
{
new ShowFinalizerThread();
GC.Collect();
GC.WaitForPendingFinalizers();
Thread.Sleep(300);
};
}
}
Скомпилируйте каждого как консольное приложение, затем работайте, test.exe (из командной строки является самым легким, IMO). Вы будете видеть что блоки финализатора домена приложения другой.
В будущем я не был бы удивлен видеть один поток финализатора на ядро, а не на AppDomain - но это кажется, что у Вас все еще будут проблемы :(
У Вас есть мои глубокие соболезнования (хотя не решение) - после того как я разыскал мертвую блокировку в Блобе Oracle. Мы смогли зафиксировать это путем избавления от него правильно, но я знаю не, все работает, что приятно - и это была реальная боль, даже находящая что один!