【问题标题】:VBA-Excel Export data to another workbook based on cell valueVBA-Excel 根据单元格值将数据导出到另一个工作簿
【发布时间】:2016-07-11 17:48:01
【问题描述】:

亲爱的知识渊博的程序员,

我想将两个不同 Excel 工作簿(阅读:心理测试)中的数据导入不同工作簿(数据库)中的单个工作表。但是,在某些情况下,一个人需要进行多次测试,因此我不希望该数据位于数据库的第一个空白行中。在那种情况下,我想将数据导入到具有其他测试值的现有行中。

例如,我有一个数据库,其中包含以下列 A(唯一标识符)、B(智力值 1)、C(智力值 2)、D(性格测试)。第 1 个人进行了智力测试和性格测试,这些结果存储在两个不同的 Excel 文件中。现在我想在数据库中汇总这些分数。性格测试的结果已经导入数据库,因此 A 和 D 列已经填满。因此,智能测试 excel 文件中的代码需要在写入新行之前识别数据库中是否已经存在人员 1。如果此人不存在,则必须创建一个新行。没有此查找的智力测试代码如下所示。

我可以想象它在 If-Else 命令的帮助下工作。此外,我提供的代码需要包含一个引用该唯一标识符的单元格。但是,我对此知之甚少,无法找到合适的解决方案。你们中的哪一位可以帮帮我吗?

Private Sub CommandButton1_Click()
Dim Intelligence1 As String
Dim Intelligence2 As String
Dim mydata As Workbook

Worksheets("Scores").Select
Intelligence1 = Range("D3")
Intelligence2 = Range("D4")

Set mydata = Workbooks.Open("C:\Users\Tim\Desktop\Database-Concept.xlsx")
Worksheets("aggregate").Select
Worksheets("aggregate").Unprotect Password:="1234"
Worksheets("aggregate").Range("a1").Select
RowCount = Worksheets("aggregate").Range("a1").CurrentRegion.Rows.Count

With Worksheets("aggregate").Range("A1")
.Offset(RowCount, 1) = Intelligence1
.Offset(RowCount, 2) = Intelligence2
End With

Worksheets("aggregate").Protect Password:="1234"
mydata.Save

End Sub

编辑

附加了两个虚拟文件的屏幕截图,消除了所有复杂性。

Intelligence form (input)

Concept database (output)

【问题讨论】:

  • 我可以想象你在 Personality xls 的某个地方有这个人的名字,另外,你真的需要打开它吗 - 我看到文件是不变的 - 你是否尝试过使用引用另一个 WB 的公式?
  • 感谢您的回答。我的想法是为一个人分配一个唯一的 ID(数字/文本/两者的组合),并且该值将手动输入到 Personality.xlsx 和 Intelligence.xlsx 的单元格中。代码可以使用该单元格来检查数据库中是否已经存在该人的条目。如果是这种情况,我假设代码只会写在那个特定的行中。否则,它应该在第一个空白行创建一个新条目。我希望这有帮助?我没有尝试公式引用。
  • 抱歉耽搁了,我的意思是这样的公式 ='C:\Users\Tim\Desktop[Database-Concept.xlsx]aggregate'!$A$1 其中 $A$1 将是单元格您将在哪里设置用户。
  • 我不确定我是否完全理解您,但设置公式的困难在于文件及其内容必须是静态的。但是,personality.xlsx 和 intelligence.xlsx 被设计为不保存的表单。患者填写的表格内容应存储在数据库中。我想(不完全确定)这会导致困难:公式将引用空的或更改的单元格值?但正如我所说,我对 Excel 和 VBA 的经验并不丰富。如果我将目前创建的 excel 文件转发给您,对您有帮助吗?
  • 我明白了,有没有一个单元格,你有病人的名字?该公式有助于从封闭的工作簿中获取值,您应该尝试它只是为了了解它。 OT:模板的图像就足够了,如果可能,请编辑您的问题以包含它。

标签: vba excel


【解决方案1】:

这行得通吗?

Private Sub CommandButton1_Click()
Dim Intelligence1 As String
Dim Intelligence2 As String
Dim mydata As Workbook
Dim RangeFoundID As Range
Dim RowCount As Long
Worksheets("Scores").Select
Intelligence1 = Range("D3")
Intelligence2 = Range("D4")

Set mydata = Workbooks.Open("C:\Users\Tim\Desktop\Database-Concept.xlsx")
Worksheets("aggregate").Select
Worksheets("aggregate").Unprotect Password:="1234"
Worksheets("aggregate").Range("a1").Select


'If the cell is constant like in the image
'note however, if there's a duplicated record it won't be fixed and will only update the first of them.
Set RangeFoundID = Columns(1).Find(Cells(2, 3).Value, LookAt:=xlWhole)

If RangeFoundID Is Nothing Then ' 1. If RangeFoundID Is Nothing
RowCount = Worksheets("aggregate").Cells.SpecialCells(xlCellTypeLastCell).Row + 1
'My suggestion above goes to the last real row, what happens if you let a whole row blank? It would count less than really are RowCount = Worksheets("aggregate").Range("a1").CurrentRegion.Rows.Count
With Worksheets("aggregate")
.Cells(RowCount, 1).Value = Cells(2, 3).Value
.Cells(RowCount, 2).Value = Intelligence1
.Cells(RowCount, 3) = Intelligence2
End With

Else ' 1. If RangeFoundID Is Nothing

With Worksheets("aggregate").Range(RangeFoundID.Address)
.Offset(RowCount, 1) = Intelligence1
.Offset(RowCount, 2) = Intelligence2
End With
End If ' 1. If RangeFoundID Is Nothing


Worksheets("aggregate").Protect Password:="1234"
mydata.Save

End Sub

【讨论】:

  • 感谢您的帮助!然而,似乎有些不对劲。 RowCount = Worksheets("aggregate").SpecialCells(xlCellTypeLastCell).Row + 1 在执行期间导致 438 错误。此外,无论 ID 是否已经在表中,它都会写入新行,就像它没有正确识别 ID 一样。您知道可能出了什么问题吗?
  • 我遇到的错误是我缺少单元格 RowCount = Worksheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell).Row + 1。对于 ID,请调试代码和您将看到我用于它的逻辑,您会注意到它失败的原因 - 提示:它可能与正在执行的查找有关 -
  • 有趣的故事:经过一个小时的反复试验,当我在输入关于我无法弄清楚的评论时,我有了最后一个想法。现在代码按预期工作。太感谢了!不幸的是,系统不允许我为您的解决方案投票...
  • 您已经接受了答案,这也很有帮助,祝您有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多