【问题标题】:Download images from a CSV / XLS catalog从 CSV / XLS 目录下载图像
【发布时间】:2016-05-01 16:29:12
【问题描述】:

编辑: 我发现这段代码可以从 xls 文件中下载图像。 来源:GET pictures from a url and then rename the picture

代码:

Option Explicit

Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Dim Ret As Long

'~~> This is where the images will be saved. Change as applicable
Const FolderName As String = "C:\Temp\"

Sub Sample()
    Dim ws As Worksheet
    Dim LastRow As Long, i As Long
    Dim strPath As String

    '~~> Name of the sheet which has the list
    Set ws = Sheets("Sheet1")

    LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To LastRow '<~~ 2 because row 1 has headers
        strPath = FolderName & ws.Range("A" & i).Value & ".jpg"

        Ret = URLDownloadToFile(0, ws.Range("B" & i).Value, strPath, 0, 0)

        If Ret = 0 Then
            ws.Range("C" & i).Value = "File successfully downloaded"
        Else
            ws.Range("C" & i).Value = "Unable to download the file"
        End If
    Next i
End Sub

它适用于 xls 文件,其中“PIC NAME”和“URL”位于两个单独的列中。我有一个 csv 文件,与 xls 不同,csv 的值在一列中,由“|”分隔(图片名称|网址)。所以 - 作为编码的菜鸟 - 作为一种解决方法,我在 Excel 中使用“文本到列”将行分成分隔符“|”下方的 2 个单独的列,这样我就可以使用原始代码。

问题:有没有办法让代码与 csv 文件一起使用?这样可以更快、更轻松地从包含数千行的大型 csv 文件中提取图像。

【问题讨论】:

  • 请删除绒毛 - 问题中不包含问候语,这是一个问答网站,而不是论坛。此外,请描述您尝试过的方法以及您的问题所在。目前,这个问题不是关于任何编程问题,而是一个“请为我编写整个代码”,这不是这个网站的目的。
  • 实际上来自该站点stackoverflow.com/questions/15641717/… 的建议显示了如何做到这一点。
  • 您能告诉我们到目前为止您的研究成果吗?谷歌搜索“vba 下载文件”将我带到stackoverflow.com/questions/17877389/…。你试过吗?同样,搜索“vba looplines in file”会产生很多有用的(堆栈溢出)解决方案来读取文件的内容。如果您仍然对此有疑问,您应该重新表述您的问题,以更具体地说明究竟什么不适合您。
  • @Leviathan 是的,我已经更新了 OP,详细说明了我如何解决这个问题。事实上,我已经找到了解决方法。如果有办法调整原始代码以使其与 csv 文件一起使用,那就太好了。

标签: excel image vba csv download


【解决方案1】:

由于 VBA 为 Excel 提供自动化,您可以手动执行的所有操作也可以通过 VBA 自动化。 Excel 甚至集成了一个宏记录器,可以自动将所有用户操作转换为 VBA 代码。这个答案解释了它是如何工作的:Excel's Macro-Recorder usage

这可用于查看 Text to columns 函数生成的 VBA 代码类型。如果你稍微清理一下代码,你最终会得到这个 VBA 命令:

Selection.TextToColumns Destination:=Range("A1") _
                      , DataType:=xlDelimited _
                      , Other:=True _
                      , OtherChar:="|"

请确保将 Selection 替换为您导入 Excel 的整个范围,或者在执行代码之前选择整个范围。还将Range("A1") 替换为您希望写入结果的范围。

应该注意的是,将内容写入excel单元格只是为了在之后解析这些单元格并不是很有效。解决您的问题的更简洁的方法是逐行读取下载的文件并根据您的需要解析每一行。

幸运的是,已经有解决方案:Read lines from a text file but skip the first two lines

【讨论】:

  • 我尝试录制宏,因为我手动将“文本到列”应用到 A1,然后将生成的代码添加到原始脚本中。整个过程并不是特别快。我将研究您建议的替代解决方案,看看是否可以对原始代码提出更有效的修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2013-03-17
  • 2012-01-27
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多