需要从一个电子表格中复制一行" A"到"" B"基于" A"中的单元格值并将其粘贴到" B"基于

时间:2015-11-07 13:05:02

标签: excel excel-vba vba

我想在电子表格中复制工作表中的第5行(“ Logg ”)" 工作订单测试.xlsm "到另一个电子表格“ Logg_test.xlsx ”。

我想在A列上过去,行号取决于它是新记录还是现有记录。

所以基本上我会根据电子表格中的单元格“B12”上的值找到行号" 工作订单测试.xlsm "并填写“工作单”。 我做错了什么?

Meteor.methods({
  isAdmin: function (username, password){
      return Admins.find({username: username, password: password}).count() > 0; 
  }
});

1 个答案:

答案 0 :(得分:0)

似乎有两个问题:第一个是你的代码中有行(“5:5”)而不是Range(“5:5”);第二个是你的搜索值。它是工作簿“Logg_test.xlsx”的活动工作表中单元格“B12”中的一个,而不是工作簿“工作订单Test.xlsm”上工作表最初活动工作表上的单元格“B12”。

如果您自己使用Range,则会转换为

Application.ActiveWorkbook.ActiveSheet.Range 

由于您激活了工作簿“Logg_test.xlsx”,因此Range(“B12”)不再引用同一个单元格。

实际上,你打算做什么都不需要选择任何东西,不这样做是好习惯。这有助于避免错误的查找值等错误。

您可以使用以下内容转换代码。

Sub copypaste()
   Dim logg_wkb As Workbook
   Dim order_test_wkb As Workbook
   Dim test_sheet As Worksheet
   Dim logg_sheet As Worksheet
   Dim target_sheet As Worksheet
   Dim lookup_value As String
   Dim copy_rng As Range
   Dim paste_rng As Range

   Dim rngSearch As Range
   Dim rngFound As Range
   Dim pasteRow As Integer

   Set logg_wkb = Workbooks.Open(Filename:="C:\Users\toreh\Documents\Logg_test.xlsx", UpdateLinks:=0)
   Set order_test_wkb = Workbooks("Work Order Test.xlsm")

   Set test_sheet = order_test_wkb.ActiveSheet
   Set logg_sheet = order_test_wkb.Worksheets("Logg")
   Set target_sheet = logg_wkb.ActiveSheet

   Set copy_rng = logg_sheet.Range("5:5")

   lookup_value = test_sheet.Range("B12")
   Set rngSearch = target_sheet.Range("B:B")
   Set rngFound = rngSearch.Find(lookup_value, LookIn:=xlValues, LookAt:=xlPart)

   If IsMatch(rngFound) Then
      pasteRow = rngFound.Row
   Else
      pasteRow = Application.Intersect(rngSearch, target_sheet.UsedRange).Rows.Count + 1
   End If
   Set paste_rng = target_sheet.Range("A" & pasteRow)

   copy_rng.Copy
   paste_rng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

   Application.CutCopyMode = False
   logg_wkb.Save
   order_test_wkb.Activate
   order_test_wkb.Sheets("Work Order").Select
   Range("A1:B1").Select
End Sub

   Private Function IsMatch(MatchRng As Range) As Boolean
      IsMatch = Not (MatchRng Is Nothing)
   End Function

这与您的代码的操作顺序相同,但仅在最后清理选择时使用select,这仍然是必需的,因为Copy会移动选择。

此版本仍然不是最佳版本,Sub的几个部分应重新排列并提取到单独的Subs和Functions中,以便于理解。特别是,提取逻辑以确定粘贴范围为单独的函数是一个好主意。