Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在VB(宏)中创建正确的循环_Vba_Excel - Fatal编程技术网

Vba 如何在VB(宏)中创建正确的循环

Vba 如何在VB(宏)中创建正确的循环,vba,excel,Vba,Excel,我已经录制并完善了以下宏,它应该创建一个额外的工作表,其中超文本链接指向原始工作表中每个表的起始单元格,称为All_tables。在此表中,每个表都用哈希符号分隔: 现在我想把它放到一个循环中,它会重复十次或更多次。我尝试使用散列符号作为程序的参考点,以找出他应该将超链接指向哪个单元格。结果如下: Sub Create_list_of_tables() Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "list of t

我已经录制并完善了以下宏,它应该创建一个额外的工作表,其中超文本链接指向原始工作表中每个表的起始单元格,称为All_tables。在此表中,每个表都用哈希符号分隔:

现在我想把它放到一个循环中,它会重复十次或更多次。我尝试使用散列符号作为程序的参考点,以找出他应该将超链接指向哪个单元格。结果如下:

Sub Create_list_of_tables()    
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "list of tables"

Const cStrDivider As String = "#"

Dim rMyCell As Range
Dim table_number As Long
table_number = 0


Do Until table_number = 10
Set rMyCell = Range("cStrDivider").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    "All_Tables!&rMyCell", TextToDisplay:="some variable pointing at the table name"
ActiveCell.Offset(1, 0).Select
table_number = table_number + 1
Loop

End Sub
但它不起作用。我对宏和VB编程完全不熟悉,所以如果你至少能告诉我方向,我会非常高兴。我的方法是完全错误的吗


非常感谢您

我不确定您希望将超链接指向的确切位置,但这将为您提供一个良好的开端。注意事项:

不要使用Select或Selection语句。它们速度慢,会产生不良影响。取而代之的是使用非常明确的语句,这些语句不依赖于光标位置,而是对您知道的事物所在的绝对位置进行评级。 使用范围对象的Find和FindNext方法查找字符串。当FindNext无法找到更多内容时,它将不返回任何内容。很好地检查,而不是执行表号循环。 更新


看看它是如何工作的,然后再往前走。

当你说它不工作时,1。这是否意味着代码有错误?或2。您的代码是否不返回任何内容或只执行任何操作,但没有编译错误?这段代码似乎是错误的:ActiveSheet.Hyperlinks.Add Anchor:=选择、地址:=、子地址:=\uU所有表&我觉得语法不对。我不知道如何正确地将变量和固定位置结合起来……当向字符串添加变量时,它需要在引号之外。试试所有的桌子rMyCell@Zaider这将使链接指向所有表!这可能不是一个有效的单元格引用。谢谢,这对开始很好。All_tables工作表应成为一个单独的表列表,即ActiveSheet中由哈希符号清除的超链接列表。简单地说,我需要它的另一种方式:-…但无论如何,你的代码帮助我了解了宏的工作原理。谢谢好极了:不客气,如果这对你有帮助,别忘了接受
Sub Create_list_of_tables()    
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "list of tables"

Const cStrDivider As String = "#"

Dim rMyCell As Range
Dim table_number As Long
table_number = 0


Do Until table_number = 10
Set rMyCell = Range("cStrDivider").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    "All_Tables!&rMyCell", TextToDisplay:="some variable pointing at the table name"
ActiveCell.Offset(1, 0).Select
table_number = table_number + 1
Loop

End Sub
Sub Create_list_of_tables()

    Const cStrDivider As String = "#"

    Dim sht As Worksheet, rMyCell As Range, rSearchRange As Range
    Dim testSht As Worksheet, firstMyCell As Range

    Set sht = ActiveSheet

    On Error Resume Next
    Set testSht = ActiveWorkbook.Sheets("All_Tables")
    If Err.Number <> 9 Then
        Application.DisplayAlerts = False
        testSht.Delete
        Application.DisplayAlerts = True    'important to set back to true!
    End If
    On Error GoTo 0

    ActiveWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
    ActiveWorkbook.Sheets(Sheets.Count).Name = "All_Tables"

    Set rSearchRange = sht.Range("A:A")

    'do initial "Find"
    Set rMyCell = rSearchRange.Find(cStrDivider)
    Set firstMyCell = rMyCell

    Do
        sht.Hyperlinks.Add Anchor:=rMyCell.Offset(0, 1), Address:="All_Tables!" & rMyCell.Address, _
            TextToDisplay:="Link"

        'get the next "MyCell" to use from the master range to search
        Set rMyCell = rSearchRange.FindNext(rMyCell)
        'increment your table counter (if you want to do this you can still
        table_number = table_number + 1
        Debug.Print firstMyCell.Address
        Debug.Print rMyCell.Address
    Loop While firstMyCell.Address <> rMyCell.Address

End Sub