[英]Select entire column as range (in worksheet 2) based on user's input i.e 'header name' in a cell / inputbox (in worksheet 1) using vba
[英]VBA to name a new Worksheet based on a range of values in a column
VBA基于列中的值范围来命名新工作表嗨,我对编写VBA有点陌生。 我整个周末都花了很多时间来工作,并且大部分人都在工作。 我对此部分以及其他一些部分感到困惑。
我正在尝试创建一个新的工作表,并根据其他工作表上一列中的值对其进行命名。
例如,在“分配(3)”工作表上,在B列中,我有13个不同的值。
我想将新创建的工作表命名为“分布”(3)工作表上单元格B2中的文本值。
然后,我想创建另一个工作表,并根据“分布(3)”工作表上B3中的值对其进行命名。
或添加x个工作表,然后命名。
我已经弄清楚了VBA可以创建x个工作表,但是我必须手动输入所需工作表的数量(在循环中)。
可行的方法是获取B2:B14范围内的值的计数,然后添加该工作表的计数,如果我能弄清楚如何将该值传递到现有代码中。
我试过将名称保存到变量。 (可能是我所知道但不知道如何提取每个值的数组)。 我只知道如何将这些值打印到立即窗口。 请参阅下面的#1。
Sub RegionNames()
Dim DatArr As Range
Dim AuxDat As Range
Dim CellCnt As Integer
Set DatArr = _
Application.InputBox( _
"Select a contiguous range of cells.", _
"SelectARAnge Demo", _
Selection.Address, , , , , 8)
CellCnt = DatArr.Count
If DatArr.Columns(1).Column > 1 Then '<<small error trap in case the user selects column A
Set AuxDat = DatArr.Offset.Offset(0, -1)
End If
Debug.Print AuxDat.Count
Debug.Print AuxDat(1).Value
Debug.Print DatArr(0) ' This is "Region"
Debug.Print DatArr(1) ' This is "Atlanta"
Debug.Print DatArr(2) ' ...
Debug.Print DatArr(3)
Debug.Print DatArr(4)
Debug.Print DatArr(5)
Debug.Print DatArr(6)
Debug.Print DatArr(7)
Debug.Print DatArr(8)
Debug.Print DatArr(9)
Debug.Print DatArr(10)
Debug.Print DatArr(11)
Debug.Print DatArr(12)
Debug.Print DatArr(13)
Debug.Print DatArr(14)
End Sub
Sub RegionList()
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select
End Sub
Sub MakeNewTab()
Dim ws As Worksheet
'ws.Name = "NewSheet"
Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
Application.WindowState = xlNormal
Sheets("Distribution (3)").Select
Sheets("Distribution (3)").Name = "Distribution (3)"
Range("B2:B14").Select
Sheets("Sheet4").Select
Sheets("Distribution (3)").Select
End Sub
您需要做的只是创建一个循环,以遍历创建名称所需的范围,在本例中,是通过Distribution (3)
表和Range("B2:B14")
。 即代码看起来像这样。
Sub MakeNewTab()
Dim ws As Worksheet
For i = 2 To 14
Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name = Sheets("Distribution (3)").Range("B" & i).Value
Next i
End Sub
然后,您可以随心所欲地调用它。
实际上,我只是做了一个执行此操作的Excel。 我写了以下内容:
Dim c as Range
Dim d as Range
Dim PEndRange As Long
Dim Pitem As String
Dim PStartRange As Long
Dim rng As Range
Dim worksh As Long
Set d = Nothing
Set c = Nothing
'first I sort the table
With Worksheets("Sheet1").Range("A1").EntireRow
Set c = .Find("HEADER", LookIn:=xlValues)
Set c = Worksheets("Sheet1").Cells(2, c.Column)
Set d = .Find("VALUE", LookIn:=xlValues)
Pitem = c.Value
End With
'This grabs the Value of the cell in row 2 of whatever column contains the header you're searching through. You can do a loop and lookup instead using counta of cells(x,c.Column) for x = 2 to lastrow, then define the last row using ActiveWorkbook.Worksheets("Sheet1").Cells(ActiveWorkbook.Worksheets("Import").Rows.count, "A").End(xlUp).Row
, and then from there do a counta on Range(c.address).EntireColumn of that string, then set that value +1 as your range limit, then repeat after setting x as that value.
If (c.EntireColumn.Find(what:=Pitem, lookat:=xlWhole, After:=Cells(2, c.Column)).Row) 0 Then
PStartRange = c.EntireColumn.Find(what:=Pitem, After:=Cells(1, c.Column)).Row
PEndRange = c.EntireColumn.Find(what:=Pitem, After:=Cells(1, c.Column), searchdirection:=xlPrevious).Row
worksh = Application.Sheets.count
worksheetexists = False
For X = 1 To worksh
If Worksheets(X).Name = left(Pitem, 29) Then 'trimmed in case string is longer than max allowed for sheet name
worksheetexists = True
GoTo NextStep:
Exit For
End If
Next X
Worksheets("Template").Copy After:=Sheets(Sheets.count) 'only if you have a template that already exists, otherwise you can just create a new sheet here
Set newsheet = ActiveSheet
newsheet.Name = left(Pitem, 29)
NextStep:
ActiveWorkbook.Worksheets(left(Pitem, 29)).Activate
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.