销售系统搭建(一)


本章节是继中台数据库后的第二章,中台数据库搭建完成,需要销售填充数据。其实有了最开始踩的坑,做起销售系统就的心应手了。

功能设计: 点击单元格–>弹出弹窗–> 填写相关信息 –> 提交

获取最新的分配数据。

卡点问题:这个部分遇到的卡点就是如何把信息分成两个部分发送数据库,因为销售数据,回访中的数据是要逐次添加的,但是跟进结果的数据只有一次,这是放在一起填写,但是拆分成了两个表。在设计窗体的时候花了一些功夫。

另外,在数据更新上面也花了些功夫,就是,数据双击后,跟进结构的数据需要再更新,设计这个部分也花了不少时间。

上代码

窗体设计:

img

第二步:双击单元格,弹出窗体,并把已有数据填入chackBOX

再客户跟进表的VBA里打开

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim selectedRow As Range
    Dim dataRange As Range
    Dim textBoxIndex As Integer
    'checkBOX数据
    Dim checkBoxRange As Range
    Dim checkBoxIndex As Integer
    Dim checkBoxColumnRange As Range
    
    Dim frm As UserForm1
    Dim columnRange As Range
    
    If Not Intersect(Target, Range("H:H")) Is Nothing Then
        ' 判断选定的单元格是否在列 H 中
        ' 如果是,则弹出弹窗

        If Target.Cells.Count > 1 Then Exit Sub         ' 检查双击的目标是否为单个单元格
        

        Set selectedRow = Target.EntireRow        ' 获取当前选中单元格所在的行
        

        ' 设置数据范围为选中行的某几列的数据,包括空单元格
        Set columnRange = selectedRow.Parent.Range("H:I,M:M,C:C")
        Set dataRange = Intersect(selectedRow, columnRange)
        
        ' 检查是否存在数据
        If dataRange Is Nothing Then Exit Sub
        
        '检查checkbox 数据,初始化checkbox
        Set checkBoxColumnRange = selectedRow.Parent.Range("T:W")
        Set checkBoxRange = Intersect(selectedRow, checkBoxColumnRange)
        
        ' 检查是否存在数据
        If checkBoxRange Is Nothing Then Exit Sub
        
        ' 创建并显示用户窗体
        Set frm = New UserForm1
        
        
        ' 将数据依次放入窗体的TextBox中
        textBoxIndex = 1
        For Each cell In dataRange
            frm.Controls("TextBox" & textBoxIndex).Text = cell.value
            textBoxIndex = textBoxIndex + 1
        Next cell
        
        
        checkBoxIndex = 1
        For Each checkCells In checkBoxRange
            If checkCells = "是" Then
                frm.Controls("CheckBox" & checkBoxIndex).value = True
            End If
            'MsgBox checkCells
            checkBoxIndex = checkBoxIndex + 1
        Next checkCells
        
        
        frm.Show
        ' 取消双击事件的默认操作
        Cancel = True
        
        Set columnRange = Nothing
        Set dataRange = Nothing
    
    End If

End Sub

第三步,窗体代码

​ 3.1 初始化变量

'初始化数组变量
Option Explicit
Dim cnn As ADODB.connection
Dim rs As ADODB.Recordset
'数组变量
Dim checkValues(1 To 4, 1 To 2) As Variant
Dim commboxValues(1 To 6, 1 To 2) As Variant

Sub InitCheckArray()

    checkValues(1, 1) = Me.CheckBox1.value
    checkValues(1, 2) = "加微信"
    checkValues(2, 1) = Me.CheckBox2.value
    checkValues(2, 2) = "加公众号"
    checkValues(3, 1) = Me.CheckBox3.value
    checkValues(3, 2) = "是否应约峰会"
    checkValues(4, 1) = Me.CheckBox4.value
    checkValues(4, 2) = "签约"
    'checkValues(5, 1) = Me.ComboBox2.value
    'checkValues(5, 2) = "意向等级"
    'checkValues(6, 1) = Me.ComboBox3.value
    'checkValues(6, 2) = "是否与校长建联"
End Sub

Sub InitCommboxArray()
    
    commboxValues(1, 1) = Me.TextBox5.value
    commboxValues(1, 2) = "回访时间"
    commboxValues(2, 1) = Me.ComboBox1.value
    commboxValues(2, 2) = "触达结果"
    commboxValues(3, 1) = Me.TextBox6.value
    commboxValues(3, 2) = "接通部门"
    commboxValues(4, 1) = Me.TextBox7.value
    commboxValues(4, 2) = "情况说明"
    commboxValues(5, 1) = Me.ComboBox3.value
    commboxValues(5, 2) = "意向等级"
    commboxValues(6, 1) = Me.ComboBox2.value
    commboxValues(6, 2) = "是否与校长建联"
    
End Sub

3.2 初始化窗体,原有的数据填充进窗体

'初始化窗体
Private Sub UserForm_Initialize()
    
'初始化数据
    Dim i As Integer
    Dim ws As Worksheet
    Dim dataRange As Range
    Dim dataValues As Variant
    Dim cell As Excel.Range
    
    ' 设置工作表对象
    Set ws = ThisWorkbook.Sheets("设置")
    
    ' 定义要获取数据的区域范围
    Set dataRange = ws.Range("B2:D7")

    Me.ComboBox1.Clear
    ' 将数据填充到 ComboBox1
    For Each cell In dataRange.Columns(1).Cells
        If cell.value <> "" Then
            Me.ComboBox1.AddItem cell.value
        End If
    Next cell
    ' 将数据填充到 ComboBox2
    Me.ComboBox2.Clear
    For Each cell In dataRange.Columns(2).Cells
        If cell.value <> "" Then
            Me.ComboBox2.AddItem cell.value
        End If        
    Next cell
    ' 将数据填充到 ComboBox3
    Me.ComboBox3.Clear
    For Each cell In dataRange.Columns(3).Cells
        If cell.value <> "" Then
            Me.ComboBox3.AddItem cell.value
        End If     
    Next cell

    ComboBox1.ListIndex = 0
    ComboBox2.ListIndex = 0
    ComboBox3.ListIndex = 0
    
    Me.TextBox5.value = Now()
    Me.TextBox1.Enabled = False
    Me.TextBox3.Enabled = False
    Me.TextBox5.Enabled = False
    Me.TextBox4.Enabled = False

    Set ws = Nothing
    Set dataRange = Nothing
   
End Sub
'提交数据

Private Sub CommandButton2_Click()
    Dim exists As Boolean
    Dim sql As String
    
    Call 连接数据库
    
    sql = "SELECT COUNT(*) FROM 跟进结果 WHERE 学校名称id = " & Me.TextBox4.value
    
    Set rs = New ADODB.Recordset
    rs.Open sql, cnn, 2, 2

    exists = (rs.Fields(0).value > 0)

    '释放对象变量空间
    rs.Close: Set rs = Nothing
    cnn.Close: Set cnn = Nothing
    
    Call 回访更新(Me.TextBox4.value)
    
    If exists Then
        ' 存在记录,执行更新操作
        UpdateData (Me.TextBox4.value)
    Else
        InsertData (Me.TextBox4.value)
    End If
    
    
    
End Sub
Sub 回访更新(id As Integer)
    ' 执行插入操作的代码
    Dim sql As String, i As Integer
    Dim filedTable As String, filedValues As String
    
    
    InitCommboxArray
    ' 执行更新操作的代码
    
    Call 连接数据库
    
    sql = "INSERT INTO 回访("
    
    For i = 1 To UBound(commboxValues, 1)
        
        filedTable = filedTable & commboxValues(i, 2) & ","
        filedValues = filedValues & "'" & commboxValues(i, 1) & "',"
        
    Next i
    
    sql = sql & filedTable & "数据总表id) values(" & filedValues & id & ")"
    
    MsgBox sql
    
    ' 添加 WHERE 子句,根据需要修改
    
    Set rs = New ADODB.Recordset
    rs.Open sql, cnn, 2, 2
    
    Set rs = Nothing
    cnn.Close: Set cnn = Nothing
    
    'Call 跟进结果更新
End Sub
' 跟进结果更新数据, 如果存在的化就更新
Sub UpdateData(id As Integer)
    Dim sql As String, i As Integer
    InitCheckArray
    ' 执行更新操作的代码

    Call 连接数据库
    
    sql = "UPDATE 跟进结果 SET "
    For i = 1 To 4
        If checkValues(i, 1) = True Then
            checkValues(i, 1) = "是"
        Else
            checkValues(i, 1) = "否"
        End If
        sql = sql & checkValues(i, 2) & "='" & checkValues(i, 1) & "', "
    Next i
    sql = Left(sql, Len(sql) - 2) ' 移除最后一个逗号和空格
    
    ' 添加 WHERE 子句,根据需要修改
    sql = sql & " WHERE 学校名称id=" & id
    
    Set rs = New ADODB.Recordset
    rs.Open sql, cnn, 2, 2
    
    Set rs = Nothing
    cnn.Close: Set cnn = Nothing
    Call 跟进结果更新
    Unload Me
End Sub
'如果不存在就插入
Sub InsertData(id As Integer)
    ' 执行插入操作的代码
    Dim sql As String, i As Integer
    Dim filedTable As String, filedValues As String

    InitCheckArray
    ' 执行更新操作的代码
    Call 连接数据库
    sql = "INSERT INTO 跟进结果("
    For i = 1 To UBound(checkValues, 1)
        Dim value As String
        
        If checkValues(i, 1) = True Then
            checkValues(i, 1) = "是"
            
        Else
            checkValues(i, 1) = "否"
        End If
        
        filedTable = filedTable & checkValues(i, 2) & ","
        filedValues = filedValues & "'" & checkValues(i, 1) & "',"
        
    Next i
    
    sql = sql & filedTable & "学校名称id) values(" & filedValues & id & ")"
    
    'MsgBox sql
    
    ' 添加 WHERE 子句,根据需要修改
    
    Set rs = New ADODB.Recordset
    rs.Open sql, cnn, 2, 2
    
    Set rs = Nothing
    cnn.Close: Set cnn = Nothing
    
    Call 跟进结果更新
    
    Unload Me
End Sub
'单元格数据更新
Sub 跟进结果更新()
    Dim newArray() As Variant
    Dim selectedRow As Long
    
    newArray = getNewArray
    
    selectedRow = ActiveCell.row
    
    MsgBox newArray(1)
    
    Dim dataRange As Range
    Set dataRange = Range("m:w").Rows(selectedRow)
    
    If Not dataRange Is Nothing Then
        ' 将数组值写入单元格
        dataRange.value = newArray
    Else
        MsgBox "未找到交叉区域"
    End If
    
    Set dataRange = Nothing
End Sub
' 数组重组
Function getNewArray() As Variant

    Dim valuesArray() As Variant, i As Integer, numRows As Integer, numRows2 As Integer
    
    ' 回访数据初次重组
    numRows = UBound(commboxValues, 1) + 1
    ReDim valuesArray(1 To numRows)
    
    If Me.TextBox3.value = "" Then
        Me.TextBox3.value = 0
    End If
    
    valuesArray(1) = Me.TextBox3.value + 1
    For i = 1 To numRows - 1
        valuesArray(i + 1) = commboxValues(i, 1)
    Next i
    
    numRows2 = numRows + UBound(checkValues, 1)
    
    ReDim Preserve valuesArray(1 To numRows2)
    
    For i = 1 To UBound(checkValues, 1)
    
        valuesArray(numRows + i) = checkValues(i, 1)
    Next i 
    getNewArray = valuesArray 
End Function

具体实现:

excel-中台数据库搭建(一)

excel-中台数据库搭建(二)

excel-中台数据库搭建(三)

excel-中台数据库搭建(四)

销售系统搭建(二)