ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba进行aci文本编辑处理

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-20 16:12 | 显示全部楼层 |阅读模式
求助:vba进行aci文本编辑处理。
       涉及到aci文本固定位置的数据替换,替换的内容来源于excel表格中公式计算所得的数据。
       在aci文本中需要替换的内容是: 每个ACT下的INPUT         =  '0'位置处的0,分别对应于表格第20行开始每行G-R列的内容(蓝色区域,空单元格按0                                                    处理)。
      例如:event.aci文本中ACT_1部分的INPUT         =  '0',由表格G20处计算得到的数据替换掉0;
                                    ACT_2部分的INPUT         =  '0',由表格H20处计算得到的数据替换掉0;
                                    ACT_3部分的INPUT         =  '0',由表格I20处计算得到的数据替换掉0;
                                    ACT_4部分的INPUT         =  '0',由表格J20处计算得到的数据替换掉0;
                                    ......
                                    ACT_12部分的INPUT         =  '0',由表格R20处计算得到的数据替换掉0。
                                    第一行数据替换完成后就保存文本,文本名称为event1;
                          下一行,
                                   各个INPUT         =  '0'由第21行的G21-R21的12个数据替换掉,
                                   第二行替换完成后就保存文本,文本名称为event2;
      依次处理,一共循环21次。最后应生成21个aci文本。
感谢各位大神能在百忙之中帮我一下,谢谢。

aci文件处理.zip

18.37 KB, 下载次数: 4

aci文件和表格

TA的精华主题

TA的得分主题

发表于 2018-6-21 06:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
'替换了12次为什么会输出21个文件?反正就这方法自己修改。

Option Explicit

Sub test()
  Dim arr, pth, i, j, k, n, brr
  pth = ThisWorkbook.Path & "\"
  brr = Sheets("底盘工况").[g20:r20] '可以支持更多数据
  Open pth & "event.aci" For Input As #1
  arr = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbNewLine)
  Close #1
  For i = 0 To UBound(arr)
    n = n + 1
    If n > UBound(brr, 2) Then Exit Sub '13个ACT对应12个数据,数据量不够
    For j = i To UBound(arr) '如果无序把i改成0
      If InStr(arr(j), "ACT_" & n) Then
        For k = j To UBound(arr)
          If InStr(arr(k), "INPUT") Then
            If Len(brr(1, n)) > 0 Then arr(k) = Replace(arr(k), "0", brr(1, n))
            Open pth & "event" & n & ".aci" For Output As #1
            Print #1, Join(arr, vbNewLine)
            Close #1
            j = UBound(arr): i = k: Exit For
          End If
        Next
      End If
  Next j, i
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-21 06:37 | 显示全部楼层
'也可能是这结果,每次替换保存后数组作初始化。楼上的代码未做初始化,自己选

Option Explicit

Sub test()
  Dim arr, pth, i, j, k, n, brr, crr
  pth = ThisWorkbook.Path & "\"
  brr = Sheets("底盘工况").[g20:r20] '可以支持更多数据
  Open pth & "event.aci" For Input As #1
  crr = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbNewLine)
  Close #1
  For i = 0 To UBound(crr)
    n = n + 1: arr = crr
    If n > UBound(brr, 2) Then Exit Sub '13个ACT对应12个数据,数据量不够
    For j = i To UBound(crr) '如果无序把i改成0
      If InStr(arr(j), "ACT_" & n) Then
        For k = j To UBound(crr)
          If InStr(arr(k), "INPUT") Then
            If Len(brr(1, n)) > 0 Then arr(k) = Replace(arr(k), "0", brr(1, n))
            Open pth & "event" & n & ".aci" For Output As #1
            Print #1, Join(arr, vbNewLine)
            Close #1
            j = UBound(crr): i = k: Exit For
          End If
        Next
      End If
  Next j, i
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-21 09:58 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-21 06:23
'替换了12次为什么会输出21个文件?反正就这方法自己修改。

Option Explicit

先谢谢您啦。文本中的第13个0是勿需替换的,也就是还是0.
                  12个数据的替换是基于蓝色区域的每一行,所以应该正好是21行。
                  这个程序有点复杂,我试了一下,但是不怎么会改。麻烦您再帮我看看,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-21 10:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-6-21 06:37
'也可能是这结果,每次替换保存后数组作初始化。楼上的代码未做初始化,自己选

Option Explicit

您指的是哪个数组,是指TNPUT出的替换内容么

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-21 10:10 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-21 06:23
'替换了12次为什么会输出21个文件?反正就这方法自己修改。

Option Explicit

替换的是蓝色区域的每一行,一行12个数据,第13个不用替换(或者按0替换)。

TA的精华主题

TA的得分主题

发表于 2018-6-21 10:42 | 显示全部楼层
你的所谓aci文件,其结构实质上 是一个 ini 文件,直接用 WritePrivateProfileString 这个API读写就成了

TA的精华主题

TA的得分主题

发表于 2018-6-21 11:05 | 显示全部楼层
  1. Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

  2. Sub Test2()
  3.     Dim strSourceFileName As String
  4.     Dim strDestinationFile As String
  5.     Dim arrSource As Variant
  6.     Dim lngRow As Long, lngCol As Long
  7.     Dim strAppName As String, strKeyName As String, strVal As String
  8.     Dim blIsOk As Long
  9.    
  10.     strSourceFileName = ThisWorkbook.Path & "\event.aci"
  11.     arrSource = Sheet2.Range("G20:R37")
  12.    
  13.     For lngRow = 1 To UBound(arrSource)
  14.         strDestinationFile = ThisWorkbook.Path & "\event-" & lngRow & ".aci"
  15.         If Dir(strDestinationFile) <> "" Then Kill strDestinationFile
  16.         FileCopy strSourceFileName, strDestinationFile
  17.         
  18.         For lngCol = 1 To UBound(arrSource, 2)
  19.             strAppName = "ACT_" & lngCol '段名
  20.             strKeyName = "INPUT" '键名
  21.             strVal = Space(2) & "'" & Val(arrSource(lngRow, lngCol)) & "'" '键值
  22.             
  23.             blIsOk = WritePrivateProfileString(strAppName, strKeyName, strVal, strDestinationFile)
  24.         Next
  25.     Next
  26. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-21 11:05 | 显示全部楼层
haopengxiang24 发表于 2018-6-21 10:10
替换的是蓝色区域的每一行,一行12个数据,第13个不用替换(或者按0替换)。

'好像看懂了,再试一下:

Option Explicit

Sub test()
  Dim arr, pth, i, j, k, n, brr, crr, ii, m
  pth = ThisWorkbook.Path & "\"
  With Sheets("底盘工况")
    brr = Range("f20:r20" & .Cells(Rows.Count, "f").End(xlUp).Row)
  End With
  Open pth & "event.aci" For Input As #1
  crr = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbNewLine)
  Close #1
  For ii = 1 To UBound(brr, 1)
    If Len(brr(ii, 1)) Then
      arr = crr: m = m + 1: n = 0
      For i = 0 To UBound(crr)
        n = n + 1
        If n + 1 > UBound(brr, 2) Then Exit For
        For j = i To UBound(crr)
          If InStr(arr(j), "ACT_" & n) Then
            For k = j To UBound(crr)
              If InStr(arr(k), "INPUT") Then
                If Len(brr(ii, n + 1)) > 0 Then arr(k) = Replace(arr(k), "0", brr(ii, n + 1))
                j = UBound(crr): i = k: Exit For
              End If
            Next
          End If
      Next j, i
      Open pth & "event" & m & ".aci" For Output As #1
      Print #1, Join(arr, vbNewLine)
      Close #1
    End If
  Next
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-21 11:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-6-21 11:05
'好像看懂了,再试一下:

Option Explicit

嗯,测试结果是正常的,非常感谢。还有点小问题,就是蓝色区域中有一行是空数据,并且第H、K、N、Q这四列的数据应该取相反值,然后在进行替换。不知道这几步能不能加进去。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-26 15:27 , Processed in 0.038449 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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