Set Rng появляется как Nothing

Я хотел бы некоторую помощь на ниже, если вы можете.

Я работаю между двумя рабочими книгами, и я хочу, чтобы первая нашла значение ячейки ("B6"), которая является датой второй рабочей книги в столбце B. Хотя кажется, что код находит дату, когда она приходит, чтобы установить его как диапазон, он приходит как пустой. Не могли бы вы помочь мне увидеть, что я делаю неправильно.

Я новичок в VBA, и я пытаюсь сделать свою жизнь проще с помощью онлайн-поиска. Заранее спасибо.

Sub Update_Forecast_2()
    Dim myFile As String
    Dim YourFolderPath As Variant
    Dim FindString As Date
    Dim newFile As String
    FindString = CLng(Date)
    Dim Rng As Range

    YourFolderPath = "C:\Users\konstand\Desktop\Forecast"
    ChDir YourFolderPath
    myFile = Application.GetOpenFilename
    If myFile = "False" Then Exit Sub
    Workbooks.Open Filename:=myFile
    newFile = Replace(myFile, YourFolderPath + "\", "")

    Range("B6").Select
    Workbooks("Forecast file.xlsm").Activate
    Sheets("Forecast_Sort").Activate
    Range("A1").FormulaR1C1 = myFile
    Workbooks(newFile).Activate
    Range("B6").Activate
    FindString = Workbooks(newFile).Sheets("Forecast").Range("B6").Value
    'MsgBox FindString
    If Trim(FindString) <> "" Then
        With Workbooks("Forecast file").Sheets("Forecast_Sort").Range("B:B")
            Set Rng = .Find(What:=DateValue(FindString), _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            If Not Rng Is Nothing Then
            Rng.Select
            End If
            Workbooks("Forecast file.xlsm").Activate
        End With
    End If
End Sub

Следуя просьбе Эрджона, чтобы помочь вам лучше понять, что я пытаюсь сделать, я прикрепил 2 изображения и кое-что объяснил. Надеюсь, я помог и не сделал это более запутанным.

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

Основной файл

Затем у меня есть файл, из которого я хочу получать обновленные значения каждую неделю, если не чаще. Имейте в виду, что этот файл каждый раз будет иметь другое имя, например "Wk09Update.xlsx", "Wk10Update.xlsx", "Wk11Update.xlsx", .......

Хотя, прежде чем я перейду к новому файлу, чтобы скопировать и вставить новые значения, которые я хочу в основной файл, с даты, когда новый файл начинает копировать значения из столбцов H, I и J и вставлять их поверх существующих значений в столбцах C, D и E. Затем я хочу перейти к новому файлу и скопировать/вставить обновленные значения оттуда в столбцы H, I и J в основном файле, чтобы я мог видеть различия от недели к неделе Обновить.

Новый файл (Wk11Update.xlsx)

Как это должно быть после Wk12Update

Что я пытаюсь сделать

Переменная объекта или с неустановленной переменной блока


person Konstantinos    schedule 12.03.2019    source источник
comment
У меня всегда возникают проблемы при настройке чего-либо со всеми параметрами. Set Rng = .Find(DateValue) работает?   -  person urdearboy    schedule 12.03.2019
comment
Даты могут быть сложными, ozgrid.com/VBA/find-dates.htm   -  person SJR    schedule 12.03.2019
comment
Сложно сказать. Даже без DateValue Rng ничего не значит.   -  person Konstantinos    schedule 12.03.2019
comment
Пожалуйста, укажите, в какой строке вы получаете сообщение об ошибке/проблеме. Также вы используете select. Это ошибка сама по себе. Не   -  person    schedule 12.03.2019
comment
Вот проблема: когда я запускаю макрос с помощью точки останова, Set Rng= отображается как Ничего, но FindString появляется так, как должно (03.05.2019). Установить Rng = .Find(What:=DateValue(FindString), _ After:=.Cells(.Cells.Count), _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext , _ MatchCase:=False)   -  person Konstantinos    schedule 12.03.2019
comment
Объясняется ваша проблема с поиском дат, а решение дается в Excel VBA Range.Find Date Это формула. Одна из проблем с вашим кодом заключается в том, что DateValue возвращает тип данных Date, которого нет в Excel.   -  person Ron Rosenfeld    schedule 12.03.2019


Ответы (1)


Прежде всего, вам нужно сделать свой код простым, например, у вас много .Activate. Это наверняка в какой-то момент приведет вас в замешательство.

вы должны сначала объявить все свои рабочие листы и рабочие книги следующим образом:

Sub Test()
dim book1 as workbook 'a workbook
dim book2 as workbook 'another workbook

dim SheetOfBook1 as worksheet 
dim SheetOfBook2 as worksheet 

set book1 = workbooks("NameOfWorkbook1.xlsm")
set book2 = workbooks("NameOfWorkbook2.xlsm")

set SheetOfBook1 = book1.worksheets("NameOfSheet")
set SheetOfBook2 = book2.worksheets("NameOfSheet")

'at this point you can check everything you want without activating something for example

 SheetOfBook1.range("A1") = SheetOfBook2.Range("A1") 'or whatever

'if you want to check if a value in book1 exists in book2 then do a loop

 dim cell as range

 for each cell in SheetOfBook2.Range("A1:A100).Cells
    If SheetOfBook1.range("A1") = Cell.Value Then
       msgbox "I founded what you are searching for"
    End If
 Next Cell
 End Sub

Таким образом, вы должны устранить все это .activate, использовать циклы и т. д. Что касается вашего примера, можете ли вы отредактировать свой вопрос и проиллюстрировать изображением, чего вы хотите достичь?

Изменить

Если вы хотите открывать книги на основе номера недели, у меня есть следующий код:

Sub Test()
Dim Main As Workbook
Dim Update As Workbook

Dim ForecastSort As Worksheet
Dim Forecast As Worksheet

Dim CheckIfOpen
Dim WeekNumber As String
Dim FirstDayInWeek

Dim FirstDayOfWeekRow As Long

Dim lRowUpdate As Long

Set Main = Workbooks("Main.xlsm")
Set ForecastSort = Main.Worksheets("Forecast_Sort")

'The code below will open the workbook which for name has the number week of today date automatically----------------------------------------------

 WeekNumber = WorksheetFunction.WeekNum(Date) + 1 'The requested week

 CheckIfOpen = IsWorkBookOpen("C:\Users\Erjon-PC\Desktop\Forecast\Wk" & 
 WeekNumber & "Update.xlsx") 'Checks if the update workbook is opened or not

 FirstDayInWeek = Date - Weekday(Date, vbUseSystem) + 2 'First day of requested week

 FirstDayOfWeekRow = ForecastSort.Range("B:B").Find(FirstDayInWeek).Row 'Finds the row of the start day of the requested week in main book


If CheckIfOpen = True Then
    Set Update = Workbooks("Wk" & WeekNumber & "Update.xlsx")
Else
    Set Update = Workbooks.Open("C:\Users\Erjon-PC\Desktop\Forecast\Wk" & WeekNumber & "Update.xlsx")
End If
'---------------------------------------------------------------------------------------------------------------------------------------------------
Set Forecast = Update.Worksheets("Forecast")

lRowUpdate = Forecast.Cells(Forecast.Rows.Count, "W").End(xlUp).Row 'Last row in column W in update book

Forecast.Range("W2:Y" & lRowUpdate).Copy

ForecastSort.Range("H" & FirstDayOfWeekRow).PasteSpecial xlPasteValues

Update.Close savechanges:=False

End Sub

Function IsWorkBookOpen(FileName As String)
Dim ff As Long, ErrNo As Long

On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0

Select Case ErrNo
Case 0:    IsWorkBookOpen = False
Case 70:   IsWorkBookOpen = True
Case Else: Error ErrNo
End Select
End Function

Приведенный выше код откроет книгу, в названии которой указан номер недели. Сегодня она откроет Wk11Update.xlsx, а на следующей неделе откроет Wk12Update.xlsx.

Если вы хотите открывать книги, в которых указаны будущие даты, просто добавьте +1 или больше к этому коду:

WeekNumber = WorksheetFunction.WeekNum(Date) + 1 'The requested week

Затем в открытой книге он найдет последнюю строку с данными в столбце W, скопирует 3 столбца, начиная с W, и вставит их в столбец H основной книги. Данные будут вставлены в строку, где находится первый день запрошенной недели.

person Erjon    schedule 12.03.2019
comment
Я прикрепил фотографии, как вы просили. Причина, по которой я не поступил так, как вы предлагаете, заключается в том, что новый файл будет менять имя каждую неделю, если не чаще, и из-за того, что я не являюсь опытным пользователем VBA, я боялся, что нанесу больше вреда чем пользы. - person Konstantinos; 13.03.2019
comment
Проблема не в названии книги. В любом случае, я проанализирую ваши файлы и отвечу вам сегодня. :) - person Erjon; 13.03.2019
comment
Я обновил свой ответ, не могли бы вы проверить его и объяснить мне больше? - person Erjon; 13.03.2019
comment
Большое спасибо за помощь, Эрджон. Я очень ценю это. Макрос для открытия файлов идеален. Я обновлю свой пост еще двумя фотографиями, чтобы помочь вам лучше понять, чего я хочу. Еще раз спасибо за ваше время. - person Konstantinos; 13.03.2019
comment
Делайте что хотите очень просто, в главной книге находим строку дня с которого начинается неделя, туда и вставляем данные. Я обновлю свой код позже, чтобы он соответствовал вашему запросу. - person Erjon; 13.03.2019
comment
Поскольку я жду вашего обновления, я хотел бы спросить вас кое-что об открытии файла. Как обычно, в соответствии с датами, которые мы сейчас запускаем на 11-й неделе, но прогноз, который публикуется каждый понедельник или вторник, относится к следующей неделе. Это означает, что мы должны открывать Wk12Update, а не Wk11Update, и поскольку я не уверен, как изменить его в вашем макросе, можете ли вы принять это во внимание? - person Konstantinos; 14.03.2019
comment
Я обновил код, извините за задержку, чтобы выполнить то, что вы хотите, вам нужно немного изучить VBA, это очень просто, поэтому, чтобы открыть книгу, имя которой на следующей неделе, вам нужно добавить 1 к переменной, которая находит неделю так: WeekNumber = WorksheetFunction.WeekNum(Date) + 1. В любом случае я обновил код. Напишите мне еще раз, если у вас будут проблемы. Также я прокомментировал код. Просто проверьте, можем ли мы скопировать нужные данные, затем, проанализировав мой код, вы найдете, как переместить их в столбец C. - person Erjon; 14.03.2019
comment
Извините за поздний ответ, я попробовал обновленный код, и хотя все выглядит нормально, когда доходит до того, что вы видите прикрепленное изображение, оно дает ошибку. Прикрепляю картинку к своему исходному сообщению. - person Konstantinos; 14.03.2019
comment
Даты в столбце B в основном файле — это реальные данные или текст? - person Erjon; 14.03.2019
comment
Они имеют пользовательский формат как исходный файл. Пользовательский формат выглядит следующим образом: [$-en-US]dd/mmm;@ - person Konstantinos; 15.03.2019
comment
затем вам нужно проверить имя рабочих книг, есть ли у них расширения .xlsm, .xlsx или .xlx, проверить имена реальных рабочих листов, потому что я поместил их только для проверки. вы должны изменить их, как они есть в ваших файлах. - person Erjon; 15.03.2019
comment
Поместите мой код в модуль, чтобы вы могли лучше его отлаживать. - person Erjon; 15.03.2019