在本文中,我们将带你了解VBA在这篇文章中,我们将为您详细介绍VBA的方方面面,并解答ExcelvsSQL-比较两行中的值常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的ExcelVBA-将
在本文中,我们将带你了解VBA在这篇文章中,我们将为您详细介绍VBA的方方面面,并解答Excelvs SQL-比较两行中的值常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Excel VBA - 将一行中的单元格复制到非错误值、Excel VBA - 退出循环、Excel VBA / SQL联合会、Excel VBA SQL读取Excel文件由于空列而返回null。
本文目录一览:- VBA(Excel)vs SQL-比较两行中的值(循环)(vba快速对比两行数据)
- Excel VBA - 将一行中的单元格复制到非错误值
- Excel VBA - 退出循环
- Excel VBA / SQL联合会
- Excel VBA SQL读取Excel文件由于空列而返回null
VBA(Excel)vs SQL-比较两行中的值(循环)(vba快速对比两行数据)
在SQL中这可能吗?这似乎是一个简单的概念。(我正在使用SQL Server 2005)
循环遍历我的SQL表中的所有行,如果一行= 65,下一行等于120,则比较m列中的值j,并在另一列中打印该值(第q列)
Sub InsertProductionCycle()Dim LR As Long Dim j As Integerj = 1 LR = Range("G" & Rows.Count).End(xlUp).Row For i = 1 To LR Step 1 Cells(i, "Q").Value = j If Cells(i, "M").Value = 65 And Cells(i + 1, "M").Value = 190 Then j = j + 1 End If Next iEnd Sub
SQL专家有什么想法吗?我可以在SQL中执行此操作吗?我的想法是:也许循环有点长(我可以在sql作业中运行它),但是可以比较行并将j循环值插入另一列中。那就是我被困住的地方。
答案1
小编典典这是一个有趣的!可能有一种更有效的方法来执行此操作,但是您可以在单个基于集合的语句中执行此操作,而无需循环或游标。
假设一个用来模拟数据的表看起来像这样(i
基本上是行号):
CREATE TABLE MyTable (i int, M int)
我使用自联接将i
行与i+1
行进行匹配,并使用aCOUNT
来确定Q
列。
;WITH data AS ( SELECT a.i, a.M, b.M as NextM , CASE WHEN a.M = 65 AND b.M = 190 THEN 1 ELSE 0 END AS shouldIncreaseQ FROM MyTable a LEFT OUTER JOIN MyTable b ON a.i + 1 = b.i)SELECT data.M, data.NextM , (SELECT COUNT(*) + 1 FROM data AS ref WHERE ref.shouldIncreaseQ = 1 AND ref.i <= data.i) as QFROM data
如果需要,您可以使用SELECT INTO将数据放入另一个表中以备将来使用。
Excel VBA - 将一行中的单元格复制到非错误值
如何解决Excel VBA - 将一行中的单元格复制到非错误值?
我想将固定列中的单元格从另一个工作簿复制到主(thisWorkbook)。我能够编写用于打开/访问其他工作簿的 VBA 代码。
假设行数不确定,典型的源工作簿如下所示。如何选择不包含错误 (N/A) 值的最后一行,然后将其复制到我的主工作簿中。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Excel VBA - 退出循环
for
当满足内部条件时,我想退出循环。满足条件后如何退出for
循环if
?我认为在我的陈述结束时有某种退出if
,但不知道这将如何运作。
Dim i As LongFor i = 1 To 50 Range("B" & i).Select If Range("B" & i).Value = "Artikel" Then Dim temp As Long temp = i End IfNext iRange("A1:Z" & temp - 1).EntireRow.Delete Shift:=xlToLeft
答案1
小编典典要提前退出循环,您可以使用Exit For
If [condition] Then Exit For
Excel VBA / SQL联合会
我正在尝试将2个不同工作表中的2个单独的列连接起来,以制成更长的列,然后可以从中使用Vlookup。
工作表1 A,B,C,D,E,F,G
工作表2 A,B,C,D,E,F,G
我想将工作表1中的B列和工作表2中的C列连接起来(联合),并找到新列表的Distinct值。我已经为此工作了好几个星期。
谢谢
答案1
小编典典您可以将ADO与Excel一起使用。
Dim cn As ObjectDim rs As ObjectDim strFile As StringDim strCon As StringDim strSQL As StringDim s As StringDim i As Integer, j As Integer''''This is not the best way to refer to the workbook''''you want, but it is very conveient for notes''''It is probably best to use the name of the workbook.strFile = ActiveWorkbook.FullName''''Note that if HDR=No, F1,F2 etc are used for column names,''''if HDR=Yes, the names in the first row of the range''''can be used. ''''This is the Jet 4 connection string, you can get more''''here : http://www.connectionstrings.com/excelstrCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"''''Late binding, so no reference is neededSet cn = CreateObject("ADODB.Connection")Set rs = CreateObject("ADODB.Recordset")cn.Open strCon''''A sample querystrSQL = "SELECT Distinct A, B C FROM ( " _ & "SELECT A, B, C " _ & "FROM [Sheet1$] " _ & "UNION ALL " _ & "SELECT A, B, C " _ & "FROM [Sheet2$] ) As J "''''Open the recordset for more processing''''Cursor Type: 3, adOpenStatic''''Lock Type: 3, adLockOptimistic''''Not everything can be done with every cirsor type and ''''lock type. See http://www.w3schools.com/ado/met_rs_open.asprs.Open strSQL, cn, 3, 3''''Write out the data to an empty sheet (no headers)Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rss
Excel VBA SQL读取Excel文件由于空列而返回null
如果Excel工作表的第一行中包含列,并且您指定了HDR=Yes
,则如果您将列名称正确地括在方括号中,因为它们包含空格和数字开头的特殊字符,那么您的第一条SQL语句就可以使用。
' OPEN CONNECTION WITH HEADERS INDICATED
connectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=""" & StrPath & StrFile & """;" & _
"Extended Properties=""Excel 12.0;HDR=Yes;"""
conn.Open connectionString
' RUN SQL WITH COLUMNS SPECIFIED
sql = "SELECT [Meter Id],[Date]" _
& ",[00:30],[01:00],...,[23:30],[24:00:00]" _
& " FROM [" + SheetName + "]"
rs.Open sql,connectionString
...
事实上,您最初的尝试应该在尝试运行时出现了错误。此外,带有SELECT * FROM
的第二条SQL应该引发空列错误,因为列名之一的长度为零,这是无效的标识符。因此,您需要显式选择列。
经过更深入的审查后,看来您的时间列可能是Custom
格式的时间值,而这些时间值实际上是格式化的Excel十进制值。因此,SQL引擎找不到[00:30]
列。要解决此问题,请将时间值列转换为文本格式。
请考虑以下子例程,以使用Text()
自动进行转换。然后,您可以在进行任何SQL查询之前从每个工作表上的其他主要方法调用此VBA子函数或函数。请注意,没有24:00:00
这样的时间值,因此该时间值可能已经是文本格式。
Sub Clean_Time_Columns()
Dim i As Integer,lastcol As Integer
Dim tmp_time As Variant
With ThisWorkbook.Worksheets("DATA")
For i = 3 To 49 ' LEAVE OUT 24:00:00
tmp_time = .Cells(1,i).Value
.Cells(1,i).NumberFormat = "@"
.Cells(1,i).Value = Application.WorksheetFunction.Text(tmp_time,"HH:MM")
Next i
End With
End Sub
,
鉴于您别无选择,只能使用提供的格式来处理文件,最好的方法/解决方法(而不是分别手动打开/删除/保存/关闭文件)似乎是使用VBA删除有问题的列,然后再运行查询。
关于VBA和Excelvs SQL-比较两行中的值的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Excel VBA - 将一行中的单元格复制到非错误值、Excel VBA - 退出循环、Excel VBA / SQL联合会、Excel VBA SQL读取Excel文件由于空列而返回null的相关知识,请在本站寻找。
本文标签: