#excel #vba #autosave
Вопрос:
Я работаю над формой excel, которая сохраняет в книге каждую запись с именем из определенной ячейки. У меня эта часть работает нормально, но я обнаружил, что если я начну ее и сохраню, затем продолжу ее и изменю значение этой ячейки, я перезапишу существующий файл с именем этого значения ячейки. Я не хочу, чтобы это случилось. Есть ли способ, которым я могу проверить, совпадает ли активное имя файла со значением ячейки, прежде чем оно позволит сохранить книгу. Вот весь код, который поможет понять, что он делает. Я бы подумал, что изложить все это в заявлении «Если» было бы правильным решением, но я не уверен. Извините, что я не умею кодировать
Private Sub cmdEnter_Click() 'Unprotect QCS sheet Sheets("QCS").Unprotect Password:="1234" 'Copy input values to sheet QCS Dim lRow As Long Dim ws As Worksheet Set ws = Worksheets("QCS") lRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row With ws .Cells(lRow, 1).Value = Range("Home!B1") .Cells(lRow, 2).Value = Range("Home!B2") .Cells(lRow, 3).Value = Range("Home!B4") .Cells(lRow, 4).Value = Range("Home!B3") .Cells(lRow, 5).Value = Me.txtRollNumber.Value .Cells(lRow, 6).Value = Me.cboTreatment.Value .Cells(lRow, 7).Value = Me.cboTensions.Value .Cells(lRow, 8).Value = Me.txtWidth.Value .Cells(lRow, 9).Value = Me.txtBasisWeight.Value .Cells(lRow, 10).Value = Me.txtSlip.Value .Cells(lRow, 11).Value = Me.txtHaze.Value .Cells(lRow, 12).Value = Me.txtOpacity.Value .Cells(lRow, 13).Value = Me.txtGloss.Value End With 'Clear input controls. Me.txtRollNumber.Value = "" Me.cboTreatment.Value = "" Me.cboTensions.Value = "" Me.txtWidth.Value = "" Me.txtBasisWeight.Value = "" Me.txtSlip.Value = "" Me.txtHaze.Value = "" Me.txtOpacity.Value = "" Me.txtGloss.Value = "" 'Save the Workbook as excel doc. Application.DisplayAlerts = False Dim Path As String Dim filename As String Path = "C:Users121375DocumentsQCSTrial" filename = Range("Home!B2") ActiveWorkbook.SaveAs filename:=Path amp; filename amp; ".xlsm" 'Save QCS Sheet as PDF 'Create and assign variables Dim saveLocation As String Dim sheetArray As Variant saveLocation = "C:Users121375DocumentsQCSTrial" amp; filename amp; ".xlsm" sheetArray = Array("QCS") 'Select specific sheets from workbook, the save all as PDF Sheets(sheetArray).Select ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ filename:=saveLocation 'Close Form. Unload Me 'Protect Sheet Again. Sheets("QCS").Protect Password:="1234" End Sub
Комментарии:
1. Не ясно (по крайней мере, для меня), чего вы хотите добиться. Поскольку
SaveAs
используется значение ячейки «B2» листа «Главная», как перезаписать активную книгу? Очевидно, что он создаст новую книгу с этим конкретным именем. Какой, на самом деле, проблемы вы хотите избежать? Все время при использованииSaveAs
создается новая рабочая книга, использующая значение ячейки «B2». Я не могу понять сценарий, который вы пытаетесь описать. Что означает**, если я начну один и сохраню его, а затем продолжу его**? Проблема в коде, который вы показываете, или это как-то связано с самим сохранением?2. Таким образом, это будет использоваться для записи проверок качества, имя файла будет номером заказа. Поэтому, когда форма введена, она извлекает номер заказа из этой ячейки и сохраняет файл. Естественно, теперь это открытая рабочая тетрадь. Теперь предположим, что кто-то меняет номер заказа на уже введенный заказ и снова заполняет форму. Тот заказ, который уже был введен, теперь перезаписан. Мне было интересно, есть ли способ заставить форму не сохраняться, если ячейка с номером заказа и активное имя файла не совпадают, и если нет, отправьте сообщение о закрытии книги.
3. Можете ли вы лучше объяснить, что означает для вас «перезаписано»? Как я уже сказал,
SaveAs
метод создает новую рабочую книгу с именем, взятым из ячейки «B1». Вы имеете в виду, чтобы избежать сохранения, если книга с таким именем, как в «B2», уже существует? Что должно означать то же самое, что и значение ячейки раньше ? Вы имеете в виду что-то вроде «это было спасено однажды в прошлом»? В любом случае, если вы попытаетесь сохранить существующую книгу, Excel подумает об этом и спросит, хотите ли вы ее перезаписать. Вы хотите отказаться от сохранения без запроса на перезапись, чтобы пользователь не нажимал «ОК», когда его об этом спрашивают?4. Я думаю, вам нужно поймать дубликат до того, как он будет занесен на рабочий лист. Что-то вроде
If WorksheetFunction.CountIf(ws.Range("B:B"), Range("Home!B2")) gt; 0 Then Exit Sub
«может быть».5. Я сделал обходной путь. Поскольку эта книга должна была быть открыта из отдельной книги, я смог связать ячейку B2 с именем файла в шаблоне, а затем попросил мою книгу запуска создать файл на основе шаблона и дать ему необходимое имя. Извините, если это не имеет смысла. Возможно, это был не самый простой способ обойти проблему, но сейчас она работает в 100% случаев. В принципе, сейчас у нас нет ИТ-поддержки для создания приложений для нас, поэтому я использую excel, чтобы попытаться что-то сделать.