Как импортировать лист из внешней книги и использовать имя файла (без .datatype в конце) в качестве имени нового рабочего листа?

Как импортировать лист из внешней рабочей книги И использовать имя файла (БЕЗ .datatype в конце) в качестве нового имени рабочего листа?

Часть с БЕЗ .datatype в конце я имел в виду, потому что я мог отделить имя файла от пути к файлу с помощью UBound, но когда я пытаюсь сделать это с именем файла и типом файла в конце, это не работает и дает мне ошибку. Возможно я не понимаю ubound достаточно хорошо.

Я нашел эту Саб где-то здесь, на форуме. Но я не хочу импортировать какой-либо лист, кроме листа, имя которого совпадает с именем самого файла. Поэтому я даже не уверен, нужно ли указывать имя листа.

Итак, у меня есть этот файл Excel с макросами VBA. И лист называется пустым (так как у меня не может быть файла Excel без листа внутри него) и У меня есть кнопка Userform, где я сначала просматриваю файл, и лист там должен быть импортирован в мой файл Excel, удалить пустой лист и импортировать новый ВНЕШНИЙ лист.

Кроме того, он должен импортировать ЛЮБОЙ лист из пути к файлу. Потому что имена всегда будут разными.

А также, как импортировать данные в формате csv? Я ищу в Google, но я не вижу, что именно заставляет его импортировать как csv в решениях других людей.

Sub ImportSheet()
   Dim sImportFile As String, sFile As String
Dim sThisBk As Workbook, wbBk As Workbook
Dim vfilename As Variant
Dim wsSht As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set sThisBk = ActiveWorkbook
sImportFile = Application.GetOpenFilename( _
FileFilter:="Comma Separated Value, *.csv", Title:="Open Workbook")
If sImportFile = "False" Then
    MsgBox "No File Selected!"
    Exit Sub

Else
    vfilename = Split(sImportFile, "\")
    sFile = vfilename(UBound(vfilename))



    Application.Workbooks.Open Filename:=sImportFile

    Set wbBk = Workbooks(sFile)

    With wbBk
        If SheetExists("GaebTesten.g42_2") Then
            Set wsSht = .Sheets("GaebTesten.g42_2")
            wsSht.Copy Before:=sThisBk.Sheets("Start")

        Else
            MsgBox "There is no sheet with name :US in:" & vbCr & .Name
        End If
        wbBk.Close SaveChanges:=False
    End With
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub


Private Function SheetExists(sWSName As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = Worksheets(sWSName)
    If Not ws Is Nothing Then SheetExists = True
End Function

Это мой второй пост о переполнении стека, и мой первый вопрос был очень глупым, и когда я задал свой первый вопрос, это был мой второй час работы с vba. Я думаю, что сейчас у меня около 30 часов, и я многому научился.

Вопрос: Я тоже сейчас делаю этот макрос Excel в VBA с пользовательской формой. Но в основном я гуглил, как это сделать, и пытаюсь реализовать это, ПОНЯЛСЯ, я не просто копирую и вставляю код. Часто я просто делаю строчку за строчкой и проверяю это. НО ... как вы все это помните? Если бы мне пришлось программировать то же самое прямо сейчас, я не знал бы, как это сделать, потому что я знаю, как работает синтаксис, но я бы не знал, какой синтаксис и прочее на самом деле использовать для достижения желаемого эффекта ...

Это происходит от повторения одних и тех же вещей = опыта? Или как получить навыки программирования, не прибегая к гуглу почти во всех деталях? Когда ютуберы смотрят в прямом эфире, как они что-то кодируют, они никогда не ищут это в Интернете ...

В ответ на нижнюю часть вашего вопроса: я не знал VBA год назад и научился, пытаясь ответить на как можно больше вопросов здесь, даже если у него уже есть ответ, чтобы записать его в память. Еще предстоит пройти долгий путь

urdearboy 10.08.2018 15:14

Также немного помогло изучение решений других людей, которые были лучше, чем у меня. \

urdearboy 10.08.2018 15:26

Поскольку вы упомянули UBound(array, dimension): это функция, которая возвращает верхнюю границу (= наивысший индекс) массива в указанном измерении. Если вы хотите манипулировать строками, вам следует взглянуть на пространство имен VBA.Strings, например VBA.Strings.Left$ - как уже указывал @urdearboy. И что касается поиска вещей во время программирования. Я должен это делать постоянно - это нормально. То, что вы делаете часто, запомнится вам, и вы сможете делать это быстро. Другие вещи, которые вы забудете, и вам нужно будет снова поискать их. Пока они тоже не прилипнут. :)

Inarion 10.08.2018 15:37

Что ж, следовало бы более внимательно изучить свой исходный код. : D UBound используется там для получения последнего фрагмента вашего исходного пути после того, как он был Split при каждой обратной косой черте. Результатом Split будет массив строк, поэтому UBound в данном случае работает.

Inarion 10.08.2018 15:46
0
4
64
3

Ответы 3

Вот два способа извлечь имя книги без расширения файла. Здесь я удаляю расширение .xlsx. Если расширение является постоянным, вы можете просто жестко его закодировать. Если нет, вы также можете использовать подстановочные знаки.


MsgBox Left(wbBk.Name, Len(ThisWorkbook.Name) - 5)
MsgBox Replace(wbBk.Name, ".xlsx", "")

Вы можете обратиться к листу с тем же именем, что и книга, используя что-то вроде

Sheets(Left(wbBk.Name, Len(ThisWorkbook.Name) - 5).Copy
Sheets(Replace(wbBk.Name, ".xlsx", "").Copy

Вы можете использовать InstrRev. Это эффективно, поскольку начинается с конца строки, в которой находится расширение.

Left$(wbBk.Name, InStrRev((wbBk.Name, ".") - 1)

Позвольте мне представить вам способ, отличный от простого манипулирования строками:

Установите новый ссылка на Microsoft Scripting Runtime. Это включит пространство имен Scripting. С его помощью вы можете делать следующее:

sImportFile = "C:\StackFolder\PrintMyName.xlsx"
With New Scripting.FileSystemObject
    Debug.Print .GetBaseName(sImportFile)
    ' Outputs "PrintMyName"
    Debug.Print .GetExtensionName(sImportFile)
    ' Outputs "xlsx"
    Debug.Print .GetFileName(sImportFile)
    ' Outputs "PrintMyName.xlsx"
    Debug.Print .GetDriveName(sImportFile)
    ' Outputs "C:"
    Debug.Print .GetParentFolderName(sImportFile)
    ' Outputs "C:\StackFolder"
End With

Вы можете создать небольшую вспомогательную функцию, которая даст вам нужную часть имени файла:

Public Function GetFilenameWithoutExtension(ByVal filename as String) as String
    With New Scripting.FileSystemObject
        GetFilenameWithoutExtension = .GetBaseName(filename)
    End With
End Function

и назовите его: sFile = GetFilenameWithoutExtension(sImportFile)


Что касается интересного использования UBound в вашей подпрограмме, вы даже можете получить имя файла (без расширения) таким образом - при условии, что оно не содержит дополнительных точек:

vfilename = Split(sImportFile, "\")
sFile = vfilename(UBound(vfilename))
SplitName = Split(sFile, ".")
FilenameWithoutExtension = SplitName(UBound(SplitName)-1)
Extension = SplitName(UBound(SplitName))

Однако это чисто академические мысли, и я бы не рекомендовал делать это таким образом.

Другие вопросы по теме