我正在合并两个excel工作表。在我开始之前,我想提一下我也有mysql工作台,所以我愿意在sql或vba中解决这个问题(我应该学习两者)。我正在使用.bed文件,它们是基因组坐标列表。简而言之,数据由染色体编号(即:chr2)索引,然后在染色体上具有数字起始和终止位置。这些数字位置可以跨越大范围(即:100-10,000)或者是单个位置(即:999-1000)。我有一个覆盖范围很大的坐标列表,在一个单独的文件中我有一个单独的位置列表。
范围为
的文件示例chromosome start stop
chr1 4561 6321
chr3 9842 11253
单个位置的文件示例:
chromosome start stop
chr1 5213 5214
chr3 10254 10255
我想组合这些工作表,以便如果在我的范围列表的范围内找到我的单个位置列表中的位置,则两者的位置都列在同一行中。列表是1000多个位置,所以我也喜欢这个程序遍历每一行。使用上面列出的示例数据,我希望我的输出如下所示:
所需输出的示例:
chromosome start stop chromosome start stop
chr1 4561 6321 chr1 5213 5214
chr3 9842 11253 chr3 10254 10255
多个单一位置很可能属于单一范围,我希望将它们列为单独的行。
我感谢任何帮助!先感谢您。我渴望学习!
答案 0 :(得分:0)
这是一个基本概述,用于查询名为“范围”和“位置”的工作表上的两个表,并在名为“结果”的工作表上输出结果
输入表应该有标题,并从左上角的单元格(A1)开始
Sub SqlJoin()
Dim oConn As New ADODB.Connection
Dim oRS As New ADODB.Recordset
Dim sPath
Dim sSQL As String, wb As Workbook
Set wb = ThisWorkbook
sSQL = " select a.chromosome, a.start, a stop," & _
" b.chromosome, b.start, b.stop " & _
" from <ranges_table> a, <positions_table> b" & _
" where b.start >= a.start and b.stop <= a.stop"
sSQL = Replace(sSQL, "<ranges_table>", _
Rangename(wb.Worksheets("Ranges").Range("A1").CurrentRegion))
sSQL = Replace(sSQL, "<positions_table>", _
Rangename(wb.Worksheets("Positions").Range("A1").CurrentRegion))
If wb.Path <> "" Then
sPath = wb.FullName
Else
MsgBox "The workbook must be saved first!"
Exit Sub
End If
oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & sPath & "';" & _
"Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';"
oRS.Open sSQL, oConn
If Not oRS.EOF Then
wb.Worksheets("Results").Range("A2").CopyFromRecordset oRS
Else
MsgBox "No records found"
End If
oRS.Close
oConn.Close
End Sub
Function Rangename(r As Range) As String
Rangename = "[" & r.Parent.Name & "$" & _
r.Address(False, False) & "]"
End Function