GVKun编程网logo

VBA(Excel)vs SQL-比较两行中的值(循环)(vba快速对比两行数据)

18

在本文中,我们将带你了解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快速对比两行数据)

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 - 将一行中的单元格复制到非错误值

如何解决Excel VBA - 将一行中的单元格复制到非错误值?

我想将固定列中的单元格从另一个工作簿复制到主(thisWorkbook)。我能够编写用于打开/访问其他工作簿的 VBA 代码。

假设行数不确定,典型的源工作簿如下所示。如何选择不包含错误 (N/A) 值的最后一行,然后将其复制到我的主工作簿中。

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Excel VBA - 退出循环

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联合会

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 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删除有问题的列,然后再运行查询。

关于VBAExcelvs SQL-比较两行中的值的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Excel VBA - 将一行中的单元格复制到非错误值、Excel VBA - 退出循环、Excel VBA / SQL联合会、Excel VBA SQL读取Excel文件由于空列而返回null的相关知识,请在本站寻找。

本文标签: