Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel 使用工作表名称动态填充列_Excel_Vba - Fatal编程技术网

Excel 使用工作表名称动态填充列

Excel 使用工作表名称动态填充列,excel,vba,Excel,Vba,我需要用工作表的名称填充特定列中的单元格 我有以下填充单个单元格的代码: Sub Worksheet_Name_Plop() Cells.WrapText = False ' Disables WordWrap [AG2].Value = ActiveSheet.Name Columns("AG").Select Selection.EntireColumn.AutoFit End Sub 我遇到的问题是,每个工作表可能有一到10000多行数据。不确定如何仅填充

我需要用工作表的名称填充特定列中的单元格

我有以下填充单个单元格的代码:

Sub Worksheet_Name_Plop()
    Cells.WrapText = False ' Disables WordWrap
    [AG2].Value = ActiveSheet.Name
    Columns("AG").Select
    Selection.EntireColumn.AutoFit
End Sub
我遇到的问题是,每个工作表可能有一到10000多行数据。不确定如何仅填充包含数据的行

有一个标题行,因此结果从每个工作表的第二行开始很重要

为了提高效率:我还需要能够跨同一文件的所有工作表执行此操作


非常感谢您的帮助

遍历行并检查列中的数据,然后在该行中写入名称(如果存在)

Sub Worksheet_Name_Plop()
    Dim lRow As Long
    Dim ws As Excel.Worksheet
    Dim iIndex As Integer

    For iIndex = 1 To ActiveWorkbook.Worksheets.count

        Set ws = Worksheets(iIndex)
        ws.Activate

        'Start at row 2
        lRow = 2

        'Loop through the rows in the worksheet
        Do While lRow <= ws.UsedRange.Rows.count

            'Check if some column has data
            If ws.Range("A" & lRow).Value <> "" Then
                 'Write the worksheet name to column AG of that row
                 ws.Range("AG" & lRow).Value = ws.Name
            End if

            'Increment you counter
            lRow = lRow + 1
            ws.Range("A" & lRow).Activate
        Loop

       Columns("AG").Select
       Selection.EntireColumn.AutoFit

    Next iIndex    

End Sub
子工作表\u Name\u Plop()
暗淡的光线和长的一样
将ws设置为Excel.Worksheet
作为整数的Dim iIndex
对于iIndex=1的ActiveWorkbook.Worksheets.count
设置ws=工作表(iIndex)
ws.Activate
'从第2行开始
lRow=2
'循环浏览工作表中的行

当lRow1000万行时,在9秒内执行以下操作:

Option Explicit

Public Sub setID1()
    Const FIRST_ROW As Long = 2
    Const COL       As String = "AG"
    Dim ws As Worksheet, lastRow As Long, t As Double, tr As Long

    Application.ScreenUpdating = False: t = Timer
    For Each ws In Application.ActiveWorkbook.Worksheets
        lastRow = ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1

        ws.Range(COL & FIRST_ROW & ":" & COL & lastRow).Value2 = ws.Name
        With ws.Cells(FIRST_ROW, COL)
            .WrapText = False
            .EntireColumn.AutoFit
        End With
        tr = tr + lastRow - FIRST_ROW + 1
    Next
    Debug.Print "setID1 - Sheets: " & Worksheets.Count & _
                       ", Rows: " & tr & ", Duration: " & Timer - t
    Application.ScreenUpdating = True
End Sub


测试:

setID1 - Sheets: 10, Rows: 10000000, Duration: 9.08203125
setID1 - Sheets: 10, Rows: 10000000, Duration: 9.064453125
setID1 - Sheets: 10, Rows: 10000000, Duration: 9.0625

setID2 - Sheets: 10, Rows: 10000000, Duration: 8.580078125
setID2 - Sheets: 10, Rows: 10000000, Duration: 8.58203125
setID2 - Sheets: 10, Rows: 10000000, Duration: 8.56640625

是否有一列将包含连续的数据,直到最后一行,例如A列?对不起,A是公平的游戏!这是有效的,可以通过工作表观看它的循环!是的,有很多快速的方法做事情,但是如果是一次性的事情或者类似的事情,我会用一个简单的循环。有时更容易看到正在发生的事情,并对它的工作感到舒服。真是闪电般的快!打印统计信息注释行是否应该在运行时更新?另外(在测试之前没有看到这一点),是否可以对结果禁用自动换行功能?我将其更新为包含
.WrapText=False
,以及一个稍快的替代方法(
.FillDown
)。打印统计数据行在执行时将更新,但您必须打开即时窗口:在VBA编辑器中-查看->即时窗口(
Ctrl+G
)增加0.1秒。Flagged=p最终开始读取代码XD-HUH。所以带
比较慢。很高兴知道^^^@findwindowo-不,
with
更快,但是在第二个选项中,
.FillDown
更快(我必须测试这一点:两个解决方案都使用
with
,第一个改为使用
.Value2=
,每个表中有100万条记录)
setID1 - Sheets: 10, Rows: 10000000, Duration: 9.08203125
setID1 - Sheets: 10, Rows: 10000000, Duration: 9.064453125
setID1 - Sheets: 10, Rows: 10000000, Duration: 9.0625

setID2 - Sheets: 10, Rows: 10000000, Duration: 8.580078125
setID2 - Sheets: 10, Rows: 10000000, Duration: 8.58203125
setID2 - Sheets: 10, Rows: 10000000, Duration: 8.56640625