Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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映射Excel列_Vba_Excel - Fatal编程技术网

用VBA映射Excel列

用VBA映射Excel列,vba,excel,Vba,Excel,我目前正在将列名映射到excel中的变量,然后将公式中的变量用于新行,下面是一个示例 Dim posType as String Cells.Find(What:="PositionType", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=F

我目前正在将列名映射到excel中的变量,然后将公式中的变量用于新行,下面是一个示例

Dim posType as String

Cells.Find(What:="PositionType", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate


posType = ActiveCell.EntireColumn.Address(False, False)
posType = Left(posType, InStr(1, posType, ":") - 1)


Sheets("sheet1").Range("A1").Select

ActiveCell.End(xlToRight).Select

ActiveCell.Offset(0, 1).Select
Selection.FormulaR1C1 = "PTH Size"

 ' PTH SIZE
Cells.Find(What:="PTH SIZE", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    ActiveCell.Offset(1, 0).Select

Selection.Formula = _
  "=IF(" & posType & "2=""PTH""," & settlementDateQuantity & "2,0)"

pthSize = ActiveCell.EntireColumn.Address(False, False)
pthSize = Left(pthSize, InStr(1, pthSize, ":") - 1)
r = ActiveCell.Row

With Worksheets("sheet1").Range(pthSize & r)
    .AutoFill Destination:=Range(pthSize & r & ":" & pthSize & lastrow&)
End With
我导入的文件可以按列的顺序每天更改,但它们都使用相同的名称,目前我使用find方法获取列,然后将字母保存为字符串,并在公式中使用引用,但是使用find和mapping 100列的过程非常缓慢

我一直在试图想出一个更好的方法来做这件事,但想不出任何更快的方法,有人能帮我提出一个可能更快的方法来做这件事吗

我也在考虑将我的项目转移到ExcelDNA上,有人知道它能让我的宏运行快多少吗


谢谢

您正在选择和移动工作簿,而不仅仅是做作业,这将大大降低程序的速度

我做了一些更改,让您朝着正确的方向前进-尝试一下: (注意:它又快又脏,所以我可能在单元格引用中犯了一些错误,但它至少可以让您朝着更好的方向前进)


再次,请注意,这仍然可以大大提高效率,但这是一种更有效的做事方式…

您正在选择和移动工作簿,而不仅仅是做作业,这将大大降低程序的速度

我做了一些更改,让您朝着正确的方向前进-尝试一下: (注意:它又快又脏,所以我可能在单元格引用中犯了一些错误,但它至少可以让您朝着更好的方向前进)


再次请注意,这仍然可以大大提高效率,但这是一种更有效的方法…

在开始映射之前,您是否将
Application.ScreenUpdate
设置为false?这样做确实可以加快速度。除此之外,我没有任何建议,尽管:-(是的,计算是错的:(无论如何,谢谢。列是否总是像a:D一样处于一个连续的范围,而不是a:D和G:I?如果是这样,您可能会将该范围放入字典并搜索该范围。请避免选择单元格;这既慢又不必要。您说添加新列的频率很低。我会有一个隐藏的工作表,其中包含列标题列表和我想知道的关于列的其他事情。我会使用
Variant=Range.Value
将隐藏的工作表和目标工作表的顶行加载到数组中。紧密循环将检查两个数组是否在同一序列中。只有当它们不在同一序列中时,您才需要断开,确定新序列并重建hidden工作表。在开始映射之前,您是否将
应用程序。屏幕更新
设置为false?这样做确实可以加快速度。除此之外,我没有任何建议,不过:-(是,计算已关闭:(无论如何,谢谢。列是否总是像a:D一样处于一个连续的范围,而不是a:D和G:I?如果是这样,您可能会将该范围放入字典并搜索该范围。请避免选择单元格;这既慢又不必要。您说添加新列的频率很低。我会有一个隐藏的工作表,其中包含列标题列表和我想知道的关于列的其他事情。我会使用
Variant=Range.Value
将隐藏的工作表和目标工作表的顶行加载到数组中。紧密循环将检查两个数组是否在同一序列中。只有当它们不在同一序列中时,您才需要断开,确定新序列并重建hidden工作表。很好,这使事情加快了一点,任何其他建议都很感谢,我理解不在工作簿中实际移动的方法,所以我将继续工作。很好,这使事情加快了一点,任何其他建议都很感谢,我理解不在工作簿中实际移动的方法,所以我将继续工作在那上面。
  Dim posType As String
  Dim SelectedCell As Range

  Set SelectedCell = Cells.Find(What:="PositionType", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
      :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
      False, SearchFormat:=False)

  posType = Mid(SelectedCell.Address, 2, InStr(2, SelectedCell.Address, "$") - 2)

  Set SelectedCell = Sheets("sheet1").Range("A1").End(xlToRight).Offset(0, 1)
  SelectedCell.Value = "PTH Size"

   ' PTH SIZE
  Set SelectedCell = Cells.Find(What:="PTH SIZE", After:=SelectedCell, LookIn:=xlFormulas, _
  LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
      False, SearchFormat:=False).Offset(1, 0)

  SelectedCell.Formula = "=IF(" & posType & "2=""PTH""," & settlementDateQuantity & "2,0)"


  pthSize = Mid(SelectedCell.Address, 2, InStr(2, SelectedCell.Address, "$") - 2)
  r = SelectedCell.Row

  Worksheets("sheet1").Range(pthSize & r).AutoFill Destination:=Range(pthSize & r & ":" & pthSize & lastrow&)