【问题标题】:How can make Sheet to activate in VBA from a variable? (A cell particularly)如何使工作表从变量在 VBA 中激活? (特别是一个细胞)
【发布时间】:2016-11-17 17:59:36
【问题描述】:

我实际上是 VBA 的新手,但我正在做一些编码来简化我的办公室工作。我知道这对你们大多数人来说都是一些业余水平的问题,但我尝试用谷歌搜索了很长一段时间,但没有找到满意的答案。

我有一个基于输入参数的 excel 文件,它最终应该引用正确的工作表 -> 复制选定的单元格 -> 生成一封电子邮件,正文粘贴复制的单元格和附件

我可以完成大部分工作,只是我不能在我的代码中将“正确表”作为变量引用。请为我点亮一些灯。谢谢。

这里是大部分代码,其余的无关紧要,太笨拙,无法粘贴所有我猜的。

Sub GenerateEmail()

   Dim olApp As Object
   Dim olMailItm As Object
   Dim iCounter As Integer
   Dim Dest As Variant
   Dim SDest As String
   Dim StrAtt1 As String
   Dim rng As Range



   Set rng = Nothing
   On Error Resume Next
   Set rng = Sheets("test").Range("A1:Q500").SpecialCells(xlCellTypeVisible)
   On Error GoTo 0

   If rng Is Nothing Then
        MsgBox "The selection is not a range or the sheet is protected" & _
               vbNewLine & "please correct and try again.", vbOKOnly
        Exit Sub
   End If

   With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

   Set olApp = CreateObject("Outlook.Application")
   Set olMailItm = olApp.CreateItem(0)

   On Error Resume Next
   With olMailItm
       SDest = ""
       StrAtt1 = ThisWorkbook.Path & "\PDF\" & Sheets("Email_Generator").Range("B16")

       .To = Worksheets("Email_Generator").Range("B14")
       .CC = "Myself"
       .BCC = ""
       .Subject = Worksheets("Email_Generator").Range("B18")
       .HTMLBody = RangetoHTML(rng)
       .attachments.Add StrAtt1
       .Display
   End With

   Set olMailItm = Nothing
   Set olApp = Nothing
End Sub

具体来说,我希望此代码“Sheets("test") 作为工作表“Test”中的单元格,它是基于我在 Excel 中输入的参数的变量,以便此代码将引用正确的工作表

   Set rng = Sheets("test").Range("A1:Q500").SpecialCells(xlCellTypeVisible)

但是当我将工作表识别为命名工作表时,例如Sheets("Email1"),它完美地工作,只是它不能成为一个变量。

我希望这篇文章不会太长,因为我试图尽可能具体。感谢所有阅读本文并试图提供帮助的人。我真的很感激。

【问题讨论】:

    标签: vba excel worksheet


    【解决方案1】:

    此函数返回用户从InputBox 中选择的工作表名称。如果用户取消或输入无效数字,则该函数返回零长度字符串。

    Sub TestFunction()
        Dim SheetName As String
        Dim rng As Range
        SheetName = getSheetNameFromInputBox
        If Len(SheetName) = 0 Then
           MsgBox Prompt:="Try Again", Title:="Invalid Sheet"
           Exit Sub
        End If
        Set rng = Sheets(SheetName).Range("A1:Q500").SpecialCells(xlCellTypeVisible)
    
        MsgBox rng.Address(External:=True)
    End Sub
    
    Function getSheetNameFromInputBox() As String
        Dim ws As Worksheet
        Dim Prompt As String
        Dim result
    
        For Each ws In ThisWorkbook.Worksheets
            If Not ws.Name = "Sheet3" Then
                Prompt = Prompt & ws.Index & ") " & ws.Name & vbCrLf
            End If
        Next
    
        result = InputBox(Prompt:=Prompt, Title:="Enter the Worksheet number", Default:=1)
        On Error Resume Next
        If IsNumeric(result) Then getSheetNameFromInputBox = Worksheets(CInt(result)).Name
        On Error GoTo 0
    End Function
    

    【讨论】:

    • 你好Thomas,谢谢你的回复,其实引用的表会基于不同的货币对,每对都会有自己的表,是否可以引用到一个单元格而不是一个输入框,这样用户就不必输入冗长的工作表名称,我很可能会有 10 多张工作表,不可能将这些工作表命名为 1 2 3 4 5 等。那个特别单元格实际上是根据我在生成器工作表中输入的参数自动生成的。再次感谢您的回复。
    • @keiar 该函数使用工作表的索引作为参考,但也列出工作表名称。将函数粘贴到代码模块中,然后按 F5 看看我的意思。或者,您可以使用带有验证列表的单元格,您可以参考。
    • Thomas:谢谢,我试图粘贴你的代码,但是当我尝试运行它时总是出错,我想我把它粘贴到了错误的地方,你介意告诉我我在哪里吗?应该添加它们吗?我是否也必须将“Sheetname”变暗?我确信我错过了一些非常明显的东西。
    • @keiar 抱歉。我忘记了我必须对结果进行类型转换。我更新了我的答案以包含一个测试。
    • 谢谢老哥,我知道我的vba知识很差,请不要抱歉,我自己应该也注意到了,稍后我会尝试你的更新代码,谢谢你的帮助远。
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2019-05-10
    • 1970-01-01
    • 2015-10-26
    • 2015-07-06
    • 2015-03-07
    相关资源
    最近更新 更多