ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 474|回复: 4

[求助] SQL使用Left结果成立,使用replace结果不成立。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-31 16:02 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助




image.png
Left使用SQL语句,结果成立。
Str = "Select Left(地点,22) + '.JPG',Count(大小),Count(数量) from [" & Sht.Name & "$" & Rng.Address(0, 0) & "] Group by  Left(地点,22) "

image.png

replace用在SQL中,结果出错。
Str = "Select replace(地点,'(1)',''),Count(大小),Count(数量) from [" & Sht.Name & "$" & Rng.Address(0, 0) & "] Group by  地点 "
image.png


  1. Function SqlRetuRs(Str)
  2.    Dim Cn As ADODB.Connection
  3.        Set Cn = New ADODB.Connection
  4.    Dim Rs As ADODB.Recordset
  5.        Set Rs = New ADODB.Recordset
  6.         Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName
  7.         Rs.Open Str, Cn, adOpenKeyset, adLockOptimistic
  8.        Set SqlRetuRs = Rs
  9. End Function

  10. '''

  11. Sub dell()
  12.     Dim Sht As Worksheet
  13.         Set Sht = Sheet1
  14.     Dim Rng As Range
  15.         Set Rng = Sht.Range("A1:D" & Sht.Cells(65536, 1).End(xlUp).Row + 10)
  16.         Debug.Print Rng.Address
  17.     Dim Rs As Recordset, Str
  18.         
  19.         Str = "Select 地点,Count(大小),Count(数量) from [" & Sht.Name & "$" & Rng.Address(0, 0) & "] Group by  地点 "
  20.         Str = "Select replace(地点,'(1)',''),Count(大小),Count(数量) from [" & Sht.Name & "$" & Rng.Address(0, 0) & "] Group by  地点 "
  21.         'Str = "Select Left(地点,22) + '.JPG',Count(大小),Count(数量) from [" & Sht.Name & "$" & Rng.Address(0, 0) & "] Group by  Left(地点,22) "
  22.         ''
  23.         Debug.Print Str
  24.         Set Rs = SqlRetuRs(Str)
  25.         Debug.Print Rs.RecordCount
  26.         With Sheet1
  27.             .Cells.Font.Size = 9
  28.             .Cells(2, "F").CopyFromRecordset Rs
  29.         End With
  30. End Sub
复制代码






TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-31 16:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
SQL解决不了,只能提前处理带括号的文件()



  1. Function TraverseReplaceBraces(SubFolder As Folder)
  2.     Dim Fso As FileSystemObject
  3.         Set Fso = New FileSystemObject
  4.     Dim oFolder As Folder
  5.     Dim oFile As File
  6.     Dim oDir, Str, nn, Ff
  7.         For Each oFolder In SubFolder.SubFolders
  8.              Debug.Print oFolder.Name
  9.              For Each oFile In oFolder.Files            '
  10.                  oDir = Replace(oFile.Path, oFile.Name, "")
  11.                  nn = InStr(UCase(oFile.Name), "(")
  12.                  If nn > 0 Then
  13.                      Str = oFile.Name
  14.                      Str = Left(Str, nn - 1)
  15.                      Str = Str & ".jpg"
  16.                      Ff = oDir & Str
  17.                      Debug.Print Fso.FileExists(Ff), Ff
  18.                      If Fso.FileExists(Ff) = False Then
  19.                         oFile.Name = Str
  20.                      Else
  21.                         Fso.DeleteFile oFile.Path
  22.                      End If
  23.                  End If
  24.              Next oFile
  25.              TraverseReplaceBraces oFolder
  26.         Next oFolder
  27.         
  28. End Function



  29. Private Sub ReplaceBraces()
  30.    ''
  31.     'Debug.Print Rng.Address
  32.    
  33.     Dim Fso As Scripting.FileSystemObject
  34.     Dim oFile As File, oFilesAs As Files
  35.     Dim oFolder As Folder, oFolder1
  36.     Dim Img As Wia.ImageFile
  37.     Dim oDate As Date
  38.     Dim oDir
  39.     Dim Cc, Ff
  40.     Dim Str, ShtName
  41.     Dim FolderPath, nn
  42.         FolderPath = "F:\图片管理"
  43.         
  44.         'Rr = Rng.Row + 2
  45.         Cc = 3
  46.         Set Fso = New Scripting.FileSystemObject
  47.         Set oFolder = Fso.GetFolder(FolderPath)
  48.         TraverseReplaceBraces oFolder
  49.         Stop
  50.         ''
  51. End Sub

复制代码




test.zip

803.63 KB, 下载次数: 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-8-1 08:55 | 显示全部楼层
自己出题自己解题,学习效果更好。


  1. Private Sub MustDelTest()
  2.      Dim Rng As Range
  3.          Set Rng = Selection
  4.      Dim Fso As Scripting.FileSystemObject
  5.          Set Fso = New Scripting.FileSystemObject
  6.      Dim oFolder As Folder
  7.      Dim oFile As File
  8.      Dim oPath
  9.          For ii = 1 To Rng.Rows.Count
  10.              oPath = ThisWorkbook.Path & Rng(ii, 1)
  11.              If Fso.FolderExists(oPath) = True Then
  12.                   Set oFolder = Fso.GetFolder(oPath)
  13.                   Debug.Print oFolder.Path & "--- has Folder " & Rng(ii, 1)
  14.                   
  15.              ElseIf Fso.FolderExists(oPath) = False Then
  16.                   Fso.CreateFolder oPath
  17.                   Set oFolder = Fso.GetFolder(oPath)
  18.                   Debug.Print oFolder.Path & "---- Create Folder " & oFolder.Path
  19.              End If
  20.          Next
  21. End Sub

复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-8-1 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
自己出题自己做题。
SQL解决这个问题,可能比Range方法好,Fso.MoveFile Rng(ii, 6), FileName

Rang方法需要改进,用Sql方法。
  1. Sub ForNextToSheet()
  2.     Dim oFile As File, FileName, oDate As Date
  3.     Dim Fso As Scripting.FileSystemObject
  4.         Set Fso = New Scripting.FileSystemObject
  5.         
  6.     Dim Sht As Worksheet
  7.         Set Sht = Sheet3
  8.     Dim Rng As Range
  9.         
  10.         Set Rng = Sht.Range("A15:A" & Sht.Range("A65536").End(xlUp).Row)
  11.         ''Debug.Print Rng.Address
  12.         For ii = 1 To Rng.Rows.Count
  13.             oDate = Rng(ii, 1)
  14.             FileName = ThisWorkbook.Path & "" & Format(oDate, "yyyy年m月") & "" & Format(oDate, "yyyy年m月d日") & "" & Rng(ii, 2)
  15.             If FileName = Rng(ii, 6) = False And Rng(ii, 1) <> "" Then
  16.                  Debug.Print Rng(ii, 1).Address, FileName = Rng(ii, 6), FileName, Rng(ii, 6)
  17.                  If Fso.FileExists(FileName) = False Then
  18.                       Fso.MoveFile Rng(ii, 6), FileName
  19.                  End If
  20.                  
  21.             End If
  22.         Next ii
  23. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2023-8-10 17:51 | 显示全部楼层
ning84 发表于 2023-7-31 16:49
SQL解决不了,只能提前处理带括号的文件()

SQL用replace能解决,出错原因或许与表格开头的空行有关,是数据不规模造成的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 13:13 , Processed in 0.032387 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表