ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求大神改一下代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-21 19:00 | 显示全部楼层 |阅读模式
本帖最后由 绝世梦想 于 2023-3-21 19:02 编辑

现在系统有两个问题,一是:批量生成物料卡后每张物料卡的材料名称后面的规格要去掉;二是:在保证同样材料名称的材料编号一致的情况下,材料编号不要跳跃,请解决一下这两个问题,不胜感谢

物料卡登记系统.7z

257.97 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2023-3-21 19:30 | 显示全部楼层
一大堆代码,,不知道那个跟那个。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-22 18:23 | 显示全部楼层
jiangxiaoyun 发表于 2023-3-21 19:30
一大堆代码,,不知道那个跟那个。。。。

鼠标右键调出命令按钮  批量生成物料卡

TA的精华主题

TA的得分主题

发表于 2023-3-22 22:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看了你的这个代码,代码确实是太罗嗦了。回头一看,原来你是WPS。难怪这么麻烦呢。
如果是office版本的话。或许借助自定义选项卡,还有SQL+VBA来解决你的问题会更加简便。
只可惜你是WPS,没有办法帮到你。不过上面有很多代码还是我还是可以借鉴的。

TA的精华主题

TA的得分主题

发表于 2023-3-23 06:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
实际很多call是一条语句就能完成的,而且你的call不具备通用性

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-23 11:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
自动编号的问题解决,只需将 批量生成物料登记卡模块中的这一部分改成如下代码即可
A = .Range("B" & n) '生成入库单自动编号
If .Range("E" & n + 28) = .Range("E" & n) Then
.Range("B" & n + 28) = .Range("B" & n) '生成单号
Else
.Range("B" & n + 28) = "WL" & Mid(A, 3, 6) & Format(Right(A, 4) + 1, "000")   '生成单号
End If   '生成单号

怎么把物料卡中材料名称中的规格去掉只保留规格型号前的部分?
1679541497729.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-23 14:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
物料卡表体内容是通过材料名称及规格型号得到的,当生成物料卡后要将第一次的材料名称后的规格型号去掉,突然间发现可以通过截取字符的长度得到,写如下代码问题得到完美解决:

.Range("E" & n) = Mid(.Range("E" & n), 1, Len(.Range("E" & n)) - Len(.Range("E" & n + 1)))   '通过截取字符长度二次获取材料名称

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-23 14:15 | 显示全部楼层
批量生成物料登记卡的完整代码如下:


Sub 批量生成物料登记卡()
On Error Resume Next
Application.ScreenUpdating = False

  Dim r%, i%
  Dim arr, brr, cc, t, crr
  Dim d As Object
  Set d = CreateObject("scripting.dictionary")
  
With Worksheets("汇总表")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    arr = .Range("A2:J" & r)
End With
  
  For i = 1 To UBound(arr)
    If Not d.exists(arr(i, 9)) Then
      Set d(arr(i, 9)) = CreateObject("scripting.dictionary")
    End If
    d(arr(i, 9))(0) = d(arr(i, 9))(0) + 1
    p = Int((d(arr(i, 9))(0) - 1) / 19) + 1                   '模板表体为15行
    m = (d(arr(i, 9))(0) - 1) Mod 19 + 1                      '模板表体为15行
    If Not d(arr(i, 9)).exists(p) Then                         '关健字在数据源中的列数
      ReDim brr(1 To 19, 1 To 10)                               '定义一个15行9列的二维数组
    Else
      brr = d(arr(i, 9))(p)
    End If
    brr(m, 1) = m
    For j = 4 To 10                                          '从取数的第列算起到取数的最后一列
      brr(m, j) = arr(i, j - 2)                         '取出的数放在j+1列,从数据源的j+2列开始数据
    Next
    d(arr(i, 9))(p) = brr
  Next
  
  With Worksheets("物料登记卡")
    .Cells.Clear
  End With
  
  r1 = 1
  With Worksheets("登记卡模板")
    For Each aa In d.keys
      For Each bb In d(aa).keys
        If bb <> 0 Then
          brr = d(aa)(bb)
          .Cells(2, 5) = aa                                           '模板表头取数的行列数
           .Cells(7, 1).Resize(UBound(brr), UBound(brr, 2)) = brr     '模板表体取数的行列数
           
           .Cells(3, 2) = .Cells(8, 7)
           If .Cells(8, 7) = "" Then: .Cells(3, 2) = .Cells(7, 7)
          .Cells(3, 5) = .Cells(8, 4)
          If .Cells(8, 4) = "" Then: .Cells(3, 5) = .Cells(7, 4)
         
          .[D7:D26].ClearContents
          .[G7:G26].ClearContents
          .[A5] = Year(.[E8]) & "年"
         
      For i = 0 To 19
     .Range("A" & 7 + i) = Month(.Range("E" & 7 + i))
     .Range("B" & 7 + i) = Day(.Range("E" & 7 + i))
      Next

.[B2] = "WL" & Year(.[E8]) & Month(.Range("E" & 8)) & "0001"  '第一张表的单据编号
   
   
   .Range("F7:J26").Copy .[C7]
   .Range("E7:G26").Copy .[D7]
   
   .[H:J].ClearContents
   .[G7:G26].ClearContents
   .[A5:G26].Borders.LineStyle = 1  '加框线
   
   
  If .Range("B3") Like "件(*)" Then    '假如计量单位有件
    .Range("M7") = Len(.Range("B3"))
   Set s = .Range("M7")
  If s = 5 Then
.Range("N7") = Mid(.Range("B3"), 3, 1)
.Range("F7") = .Range("F7") / .Range("N7")
  .Range("F8") = "=F7+D8-E8"
.Range("F8:F" & .Cells(Rows.Count, 3).End(xlUp).Row + 1).FillDown

Else
.Range("N7") = Mid(.Range("B3"), 3, 2)
.Range("F7") = .Range("F7") / .Range("N7")
  .Range("F8") = "=F7+D8-E8"
.Range("F8:F" & .Cells(Rows.Count, 3).End(xlUp).Row + 1).FillDown
End If  '假如计量单位有件
Else
.Range("N7") = 1
.Range("F7") = .Range("F7") / .Range("N7")
.Range("F8") = "=F7+D8-E8"
.Range("F8:F" & .Cells(Rows.Count, 3).End(xlUp).Row + 1).FillDown
End If
   If .Range("C7") = "期初余额" Then: .Range("A7:B7").ClearContents
   .Range("A" & .Cells(Rows.Count, 3).End(xlUp).Row + 1 & ":G26").ClearContents
    .Range("A1:G26").Copy Worksheets("物料登记卡").Cells(r1, 1)
          r1 = r1 + 28   '一张入库单的总行数是21行
         
        End If
        
     Next
    Next
   
End With
  

With Worksheets("物料登记卡")
For m = 0 To r1 / 26                                                  '第一张入库单的表体最后一行行号是19
n = 28 * m + 2
t = Sheets("汇总表").[I:I].Find(.Range("E" & n), , , , , xlNext).Row

   .Range("E" & n) = Sheets("汇总表").Cells(t, 1)
  
   
If .Range("E" & n) = .Range("E" & n + 28) Then: .Range("F" & n + 33) = .Range("F" & n + 23) + .Range("D" & n + 33) - .Range("E" & n + 33)

A = .Range("B" & n) '生成入库单自动编号
If .Range("E" & n + 28) = .Range("E" & n) Then
.Range("B" & n + 28) = .Range("B" & n) '生成单号
Else
.Range("B" & n + 28) = "WL" & Mid(A, 3, 6) & Format(Right(A, 4) + 1, "000")   '生成单号
End If   '生成单号



.Columns("D:F").Select             '单元格范围去零值
Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole '单元格范围去零值


.Range("E" & n) = Mid(.Range("E" & n), 1, Len(.Range("E" & n)) - Len(.Range("E" & n + 1)))   '通过截取字符长度二次获取材料名称


Next
End With
Application.ScreenUpdating = True
MsgBox "物料卡生成成功": Sheets("物料登记卡").Select
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 07:28 , Processed in 0.042499 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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