1. Const COLUMN_NUM = 20 'クラムー数 
  2. Const TYPE_PK = "PK" 'PKクラム 
  3.  
  4.  
  5. 'PKによってデータ生成 
  6. Sub FunDataByPk(WSheet As Worksheet, Row_Start As Long, Row_End As Long, Row_Cnt As Long
  7.     '変数定義 
  8.     Dim PK_Array As Variant 'PK列存储数组 
  9.     Dim PK_Count As Integer ' 
  10.     Dim PK_Array_Value As Variant 
  11.      
  12.     'PK数 
  13.     For i = 1 To COLUMN_NUM 
  14.        If Trim(WSheet.Cells(3, i)) = "" Then 
  15.            Exit For 
  16.        End If 
  17.        Tmp_Value = Trim(WSheet.Cells(5, i)) 'PK行 
  18.        'PK行値=PKの場合 
  19.        If Tmp_Value = TYPE_PK Then 
  20.            PK_Count = PK_Count + 1 
  21.        End If 
  22.     Next 
  23.      
  24.      
  25.     'PK配列格納を定義 
  26.     ReDim PK_Array_Value(PK_Count - 1) '存放每个PK初始值 
  27.     ReDim PK_Array(PK_Count - 1) '存放PK列数 
  28.     PK_Count = 0 
  29.      
  30.     '存放各个PK的初始值 
  31.     For i = LBound(PK_Array_Value) To UBound(PK_Array_Value) 
  32.        PK_Array_Value(i) = 1 
  33.     Next 
  34.     'PK_Array_Value(1) = 9 
  35.      
  36.     'PKを取得 
  37.     For i = 1 To COLUMN_NUM 
  38.        If Trim(WSheet.Cells(3, i)) = "" Then 
  39.            Exit For 
  40.        End If 
  41.        Tmp_Value = Trim(WSheet.Cells(5, i)) 'PK行 
  42.        'PK行値=PKの場合 
  43.        If Tmp_Value = TYPE_PK Then 
  44.            PK_Array(PK_Count) = i 
  45.            PK_Count = PK_Count + 1 
  46.        End If 
  47.     Next 
  48.      
  49.      
  50.      
  51.      
  52.     Dim No As Long '第一个PK变量值 
  53.     No = 1 
  54.     Dim Var_LNum As Long '总列数 
  55.     Var_LNum = Row_Start 
  56.      
  57.     For r = Row_Start To (Row_Cnt + Row_Start) 
  58.         For l = 1 To COLUMN_NUM 
  59.             Tmp_Type = Trim(WSheet.Cells(3, l)) 
  60.             Tmp_Byte = VBA.Split(Trim(WSheet.Cells(4, l)), ","
  61.             Tmp_IsPk = Trim(WSheet.Cells(5, l)) 
  62.             If Tmp_Type = "" Then 
  63.                 Var_LNum = l 
  64.                 Exit For 
  65.             End If 
  66.              
  67.             'PK的场合 
  68.             If Tmp_IsPk = TYPE_PK Then 
  69.                  
  70.                 If l = PK_Array(0) Then '如果当前列是顺番PK列处理 
  71.                     If Len(No & "") > Tmp_Byte(0) Then ' 
  72.                         No = 1 
  73.                         Tmp_V = PK_Array_Value(1) + 1 '第二个PK值 
  74.                         PK_Array_Value(1) = Tmp_V 
  75.                          
  76.                     End If 
  77.                     WSheet.Cells(r, l) = No '第一个PK赋值 
  78.                     No = No + 1 
  79.                 Else '非顺番PK列处理 
  80.                      
  81.                     Dim Tmp_Byte_i As Variant 
  82.                     For i = 1 To UBound(PK_Array) 
  83.                         'Tmp_Byte_i = VBA.Split(Trim(WSheet.Cells(4, PK_Array(i))), ",") 
  84.                         Tmp_Byte_i = VBA.Split(Trim(WSheet.Cells(4, PK_Array(i))), ","
  85.                      
  86.                         If Int(Len(PK_Array_Value(i) & "")) > Int(Tmp_Byte_i(0)) Then 
  87.                             
  88.                            PK_Array_Value(i) = PK_Array_Value(i) - 1 
  89.                            If (i + 1) > UBound(PK_Array) Then 
  90.                                For h = 1 To Var_LNum 
  91.                                    WSheet.Cells(r, h).Clear '清空最后一行 
  92.                                Next 
  93.                                Exit Sub 
  94.                            End If 
  95.                            PK_Array_Value(i + 1) = PK_Array_Value(i + 1) + 1 
  96.                         End If 
  97.                     Next 
  98.                     '给当前PK列赋值 
  99.                     For i = 1 To UBound(PK_Array) 
  100.                         Tmp_Column_i = PK_Array(i) 
  101.                         If Tmp_Column_i = l Then 
  102.                             WSheet.Cells(r, l) = PK_Array_Value(i) 
  103.                         End If 
  104.                     Next 
  105.                 End If 
  106.             End If 
  107.         Next 
  108.     Next 
  109.      
  110.  
  111.  
  112. End Sub 
  113.  
  114.  
  115. '数字列を生成 
  116. Function GetNumerics(Num As IntegerAs String 
  117.     For i = 1 To Num 
  118.         Tmp = GetNumeric 
  119.         If Tmp = 10 Then 
  120.             If i = 1 Then 
  121.                 Tmp = 1 
  122.             Else 
  123.                 Tmp = 0 
  124.             End If 
  125.         End If 
  126.         GetNumerics = GetNumerics & Tmp 
  127.     Next 
  128. End Function 
  129.  
  130. '数字を生成 
  131. Function GetNumeric() As Integer 
  132.     Do While GetNumeric = 0 
  133.         GetNumeric = Int(Rnd * 11) 
  134.     Loop 
  135. End Function 
  136.  
  137.  
  138. Function Test() 
  139.      
  140.     Dim WSheet As Worksheet 
  141.      
  142.     Set WSheet = Worksheets(1) 
  143.          
  144.     Call FunDataByPk(WSheet, 6, 6, 50000) 
  145.  
  146. End Function