当前位置: 首页 > news >正文

【Settlement】P1:整理GH中的矩形GRID角点到EXCEL中

1.参数化生成Grid

a GH的【坐标】数据整理为EXCEL

在这里插入图片描述

Sub ReorganizeDataWithBracketExtraction()Dim ws As WorksheetDim lastRow As LongDim lastCol As LongDim i As Long, j As LongDim cellValue As StringDim colIndex As LongDim newRow As LongDim targetCol As Long' 设置工作表Set ws = ActiveSheet' 找到数据的最后一行和最后一列lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).RowlastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column' 创建新工作表Dim newWs As WorksheetSet newWs = Worksheets.AddnewWs.Name = "PointCoord_Data"' 设置表头newWs.Cells(1, 1).value = "No."' 处理原始数据For j = 1 To lastColFor i = 1 To lastRowcellValue = Trim(ws.Cells(i, j).value)' 检查是否以{数字}开头If cellValue <> "" And Left(cellValue, 1) = "{" Then' 提取大括号中的数字Dim bracketPos As LongbracketPos = InStr(cellValue, "}")If bracketPos > 1 ThenDim numberStr As StringnumberStr = Mid(cellValue, 2, bracketPos - 2)' 检查是否为数字If IsNumeric(numberStr) ThentargetCol = Val(numberStr) + 2 ' +2因为从B列开始' 设置列标题 (A, B, C, D...)If newWs.Cells(1, targetCol).value = "" ThennewWs.Cells(1, targetCol).value = GetColumnLetter(Val(numberStr) + 1)End If' 找到目标列的下一个空行(从第2行开始)newRow = newWs.Cells(newWs.Rows.Count, targetCol).End(xlUp).Row + 1If newWs.Cells(2, targetCol).value = "" Then newRow = 2' 复制数据列表到新位置Dim currentRow As LongcurrentRow = i + 1 ' 跳过{n}行本身' 复制{n}后面的所有连续数据Do While currentRow <= lastRowDim currentValue As StringcurrentValue = Trim(ws.Cells(currentRow, j).value)' 如果为空或遇到下一个{n}模式则停止If currentValue = "" Then Exit DoIf Left(currentValue, 1) = "{" And InStr(currentValue, "}") > 1 Then Exit Do' 清理数据:只保留花括号内的内容Dim cleanedValue As StringcleanedValue = ExtractBracketContent(currentValue)If cleanedValue <> "" ThennewWs.Cells(newRow, targetCol).value = cleanedValuenewRow = newRow + 1End IfcurrentRow = currentRow + 1LoopEnd IfEnd IfEnd IfNext iNext j' 添加行号到第一列(从A2开始)Dim rowCount As LongrowCount = 1' 找到实际有数据的最后一行Dim dataLastRow As LongdataLastRow = 1For i = 2 To 50 ' 检查前50列Dim tempLastRow As LongtempLastRow = newWs.Cells(newWs.Rows.Count, i).End(xlUp).RowIf tempLastRow > dataLastRow ThendataLastRow = tempLastRowEnd IfNext i' 添加行号For i = 2 To dataLastRownewWs.Cells(i, 1).value = rowCountrowCount = rowCount + 1Next i' 找到有数据的最后一列Dim dataLastCol As LongdataLastCol = 1For i = 2 To 50If newWs.Cells(1, i).value <> "" ThendataLastCol = iEnd IfNext i' 格式化工作表With newWs.Cells.Font.Name = "Arial".Cells.Font.Size = 10.Rows(1).Font.Bold = True.Columns(1).Font.Bold = True.Columns.AutoFit' 设置边框If dataLastRow > 1 And dataLastCol > 1 ThenDim dataRange As RangeSet dataRange = .Range(.Cells(1, 1), .Cells(dataLastRow, dataLastCol))With dataRange.Borders.LineStyle = xlContinuous.Weight = xlThinEnd With' 设置标题背景.Rows(1).Interior.Color = RGB(220, 220, 220).Columns(1).Interior.Color = RGB(240, 240, 240)End IfEnd With' 激活新工作表newWs.ActivatenewWs.Range("A1").SelectMsgBox "数据整理完成!" & vbCrLf & _"? 数据从B列开始排列" & vbCrLf & _"? 第一行显示字母标号(A,B,C...)" & vbCrLf & _"? 第一列显示数字编号(1,2,3...)" & vbCrLf & _"? 只保留花括号{}内的内容" & vbCrLf & _"新工作表: " & newWs.Name
End Sub' 函数:提取花括号内的内容
Function ExtractBracketContent(inputValue As String) As StringDim result As StringDim startPos As LongDim endPos As LongDim tempResult As Stringresult = ""startPos = 1' 查找所有花括号内的内容DostartPos = InStr(startPos, inputValue, "{")If startPos = 0 Then Exit DoendPos = InStr(startPos, inputValue, "}")If endPos = 0 Then Exit Do' 提取花括号内的内容tempResult = Mid(inputValue, startPos + 1, endPos - startPos - 1)' 如果结果不为空,添加到总结果中If Trim(tempResult) <> "" ThenIf result <> "" Thenresult = result & "," & Trim(tempResult)Elseresult = Trim(tempResult)End IfEnd IfstartPos = endPos + 1Loop' 如果没找到花括号,检查是否有纯数字(用逗号分隔)If result = "" Then' 移除所有非数字、非逗号、非空格、非负号、非小数点的字符Dim cleanStr As StringDim i As LongDim char As StringcleanStr = ""For i = 1 To Len(inputValue)char = Mid(inputValue, i, 1)If IsNumeric(char) Or char = "," Or char = " " Or char = "-" Or char = "." ThencleanStr = cleanStr & charEnd IfNext i' 清理多余的空格和逗号cleanStr = Trim(cleanStr)Do While InStr(cleanStr, "  ") > 0cleanStr = Replace(cleanStr, "  ", " ")LoopDo While InStr(cleanStr, " ,") > 0cleanStr = Replace(cleanStr, " ,", ",")LoopDo While InStr(cleanStr, ", ") > 0cleanStr = Replace(cleanStr, ", ", ",")Loop' 移除开头和结尾的逗号If Left(cleanStr, 1) = "," Then cleanStr = Mid(cleanStr, 2)If Right(cleanStr, 1) = "," Then cleanStr = Left(cleanStr, Len(cleanStr) - 1)result = Trim(cleanStr)End IfExtractBracketContent = result
End Function' 函数:将数字转换为字母
Function GetColumnLetter(colNum As Long) As StringDim result As StringDim temp As LongDotemp = colNum Mod 26If temp = 0 Thenresult = "Z" & resultcolNum = colNum \ 26 - 1Elseresult = Chr(64 + temp) & resultcolNum = colNum \ 26End IfLoop While colNum > 0GetColumnLetter = result
End Function

a GH的【点编号】数据整理为EXCEL

在这里插入图片描述

Sub ReorganizeDataWithBracketExtraction()Dim ws As WorksheetDim lastRow As LongDim lastCol As LongDim i As Long, j As LongDim cellValue As StringDim colIndex As LongDim newRow As LongDim targetCol As Long' 设置工作表Set ws = ActiveSheet' 找到数据的最后一行和最后一列lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).RowlastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column' 创建新工作表Dim newWs As WorksheetSet newWs = Worksheets.AddnewWs.Name = "PointName_Data"' 设置表头newWs.Cells(1, 1).value = "No."' 调试信息Debug.Print "开始处理,数据范围: " & lastRow & " 行, " & lastCol & " 列"' 处理原始数据For j = 1 To lastColFor i = 1 To lastRowcellValue = Trim(CStr(ws.Cells(i, j).value))' 输出所有非空单元格内容进行调试If cellValue <> "" ThenDebug.Print "单元格(" & i & "," & j & "): [" & cellValue & "]"End If' 检查是否以{数字}开头If cellValue <> "" And Left(cellValue, 1) = "{" ThenDebug.Print "*** 找到花括号标识符: " & cellValue' 提取大括号中的数字Dim bracketPos As LongbracketPos = InStr(cellValue, "}")If bracketPos > 1 ThenDim numberStr As StringnumberStr = Mid(cellValue, 2, bracketPos - 2)Debug.Print "提取的数字字符串: [" & numberStr & "]"' 检查是否为数字If IsNumeric(numberStr) ThenDim colNumber As LongcolNumber = Val(numberStr)targetCol = colNumber + 2 ' +2因为从B列开始Debug.Print "列号: " & colNumber & ", 目标列: " & targetCol' 设置列标题 (A, B, C, D...)If newWs.Cells(1, targetCol).value = "" ThennewWs.Cells(1, targetCol).value = GetColumnLetter(colNumber + 1)Debug.Print "设置列标题: " & GetColumnLetter(colNumber + 1) & " 在列 " & targetColEnd If' 找到目标列的下一个空行(从第2行开始)newRow = newWs.Cells(newWs.Rows.Count, targetCol).End(xlUp).Row + 1If newWs.Cells(2, targetCol).value = "" Then newRow = 2Debug.Print "开始写入行: " & newRow' 复制数据列表到新位置Dim currentRow As LongcurrentRow = i + 1 ' 跳过{n}行本身' 复制{n}后面的所有连续数据Do While currentRow <= lastRowDim currentValue As StringcurrentValue = Trim(CStr(ws.Cells(currentRow, j).value))Debug.Print "检查数据行(" & currentRow & "," & j & "): [" & currentValue & "]"' 如果为空则停止If currentValue = "" ThenDebug.Print "遇到空行,停止"Exit DoEnd If' 如果遇到下一个{n}模式则停止If Left(currentValue, 1) = "{" And InStr(currentValue, "}") > 1 ThenDebug.Print "遇到下一个花括号标识符,停止: " & currentValueExit DoEnd If' 清理数据:移除序号前缀(如 "7. FTA8" -> "FTA8")Dim cleanedValue As StringcleanedValue = RemoveNumberPrefix(currentValue)Debug.Print "清理前: [" & currentValue & "] -> 清理后: [" & cleanedValue & "]"If cleanedValue <> "" ThennewWs.Cells(newRow, targetCol).value = cleanedValueDebug.Print "写入数据到(" & newRow & "," & targetCol & "): " & cleanedValuenewRow = newRow + 1End IfcurrentRow = currentRow + 1LoopElseDebug.Print "花括号内不是数字: " & numberStrEnd IfElseDebug.Print "未找到右花括号"End IfEnd IfNext iNext j' 添加行号到第一列(从A2开始)Dim rowCount As LongrowCount = 1' 找到实际有数据的最后一行Dim dataLastRow As LongdataLastRow = 1For i = 2 To 50 ' 检查前50列Dim tempLastRow As LongtempLastRow = newWs.Cells(newWs.Rows.Count, i).End(xlUp).RowIf tempLastRow > dataLastRow ThendataLastRow = tempLastRowEnd IfNext iDebug.Print "数据最后一行: " & dataLastRow' 添加行号For i = 2 To dataLastRownewWs.Cells(i, 1).value = rowCountrowCount = rowCount + 1Next i' 找到有数据的最后一列Dim dataLastCol As LongdataLastCol = 1For i = 2 To 50If newWs.Cells(1, i).value <> "" ThendataLastCol = iEnd IfNext iDebug.Print "数据最后一列: " & dataLastCol' 格式化工作表With newWs.Cells.Font.Name = "Arial".Cells.Font.Size = 10.Rows(1).Font.Bold = True.Columns(1).Font.Bold = True.Columns.AutoFit' 设置边框If dataLastRow > 1 And dataLastCol > 1 ThenDim dataRange As RangeSet dataRange = .Range(.Cells(1, 1), .Cells(dataLastRow, dataLastCol))With dataRange.Borders.LineStyle = xlContinuous.Weight = xlThinEnd With' 设置标题背景.Rows(1).Interior.Color = RGB(220, 220, 220).Columns(1).Interior.Color = RGB(240, 240, 240)End IfEnd With' 激活新工作表newWs.ActivatenewWs.Range("A1").SelectMsgBox "数据整理完成!" & vbCrLf & _"? 处理了 " & (dataLastCol - 1) & " 列数据" & vbCrLf & _"? 共 " & (dataLastRow - 1) & " 行数据" & vbCrLf & _"? 已移除所有序号前缀" & vbCrLf & _"? 请查看立即窗口(Ctrl+G)的调试信息" & vbCrLf & _"新工作表: " & newWs.Name
End Sub' 函数:移除数据项前面的序号(如 "7. FTA8" -> "FTA8")
Function RemoveNumberPrefix(inputValue As String) As StringDim result As StringDim value As StringDim i As Longvalue = Trim(inputValue)result = value' 查找 "数字." 模式For i = 1 To Len(value)Dim char As Stringchar = Mid(value, i, 1)If IsNumeric(char) Then' 继续查找数字ElseIf char = "." Then' 找到点号,提取后面的内容If i < Len(value) Thenresult = Trim(Mid(value, i + 1))' 移除可能的前导空格Do While Left(result, 1) = " "result = Mid(result, 2)LoopEnd IfExit ForElseIf char = " " Then' 如果遇到空格且前面都是数字,也认为是序号Dim beforeSpace As StringbeforeSpace = Left(value, i - 1)If IsNumeric(beforeSpace) Thenresult = Trim(Mid(value, i + 1))End IfExit ForElse' 遇到非数字非点号字符,不是序号格式Exit ForEnd IfNext iRemoveNumberPrefix = result
End Function' 函数:将数字转换为字母
Function GetColumnLetter(colNum As Long) As StringDim result As StringDim temp As LongDotemp = colNum Mod 26If temp = 0 Thenresult = "Z" & resultcolNum = colNum \ 26 - 1Elseresult = Chr(64 + temp) & resultcolNum = colNum \ 26End IfLoop While colNum > 0GetColumnLetter = result
End Function
http://www.dtcms.com/a/288673.html

相关文章:

  • 算法题(176):three states
  • Python 图片爬取入门:从手动下载到自动批量获取
  • 【JS逆向基础】数据库之MongoDB
  • Django接口自动化平台实现(四)
  • 基于单片机的智能家居安防系统设计
  • API接口签名和敏感信息加密使用国密SM方案
  • Web开发 04
  • 【新手向】PyTorch常用Tensor shape变换方法
  • 零基础学习性能测试第二章-linux/jvm/mysql等数据收集环境搭建
  • Golang基础语法-数据类型
  • Go语言--语法基础6--基本数据类型--map类型
  • Java学习第六十部分——JVM
  • An End-to-End Attention-Based Approach for Learning on Graphs NC 2025
  • 04 51单片机之数码管显示
  • Shell脚本-uniq工具
  • 两个路由器通过不同的网段互联
  • 从TPACK到TPACK - AI:人工智能时代教师知识框架的重构与验证
  • EPLAN 电气制图(十): 继电器控制回路绘制(下)放料、放灰
  • 基于单片机的IC卡门禁系统设计
  • 最大子数组和问题-详解Kadane算法
  • 每日一题7.20
  • OSS文件上传(一):简单上传
  • feignClient 调用详细流程
  • Valgrind Memcheck 全解析教程:6个程序说明基础内存错误
  • 判断一个数是否为质数方法
  • VSCode使用Jupyter完整指南配置机器学习环境
  • c#:TCP服务端管理类
  • 正点原子stm32F407学习笔记10——输入捕获实验
  • 2025 年科技革命时刻表:四大关键节点将如何重塑未来?
  • 内网后渗透攻击过程(实验环境)--3、横向攻击