Excel 2016 VBA 代码用于复选框在从用户窗体 1 中选择时输入“是”或“否”

Excel 2016 VBA 代码用于复选框在从用户窗体 1 中选择时输入“是”或“否”

好的,我是这个社区的新成员,我从这个网站其他部分的许多用户那里得到了很大的帮助。我昨天发布了一个问题,但还没有得到任何答案。我在网站上浏览 excel vba 问题时偶然发现了这个社区,我想我可能把问题发错了版块,所以为什么不试试这里,也许有人可以帮助我解决这个问题。如果这是重复的问题,我真的很抱歉。

我有一个用户表单,它是在本站一些用户的帮助下制作的,所有功能都正常工作。我不得不在其中一张表单中做了一些更改,现在我不知道如何使用新添加的选项来让它工作。它是一个复选框 1,我在用户表单 1 上添加了它,如果按下或选中它,前两个文本框中的数据也会被复制到名为 profitsloss 的表单(同一工作簿)中。13 张表单。12 张用于月份,一张用于 profitsloss。我需要 vba 代码来使复选框 1 工作,这样只有选中它时,它才会复制 profitsloss 中的数据。

如果有人能帮忙,我将不胜感激。这真是个困境!任何帮助都对实现这一目标非常有帮助。提前致谢。代码如下,目前位于 userform1 中。

Private Sub ComboBox1_Change()

Dim SheetName As String
Dim ws As Worksheet
Dim LastRow As Long

SheetName = ComboBox1.Value
Set ws = Sheets(SheetName)

LastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
Label8.Caption = "         Balance is: " & ws.Cells(LastRow, 7).Value


 Private Sub CommandButton1_Click()

 Dim dcc As Long
 Dim abc As Worksheet, pfl As Worksheet

 Set abc = ThisWorkbook.Worksheets(Me.ComboBox1.Value)
 Set pfl = Sheets("ProfitLoss")

 With abc

 dcc = .Range("A" & Rows.Count).End(xlUp).Row

.Cells(dcc + 1, 1).Value = Date
.Cells(dcc + 1, 2).Value = Me.TextBox1.Value
.Cells(dcc + 1, 3).Value = Me.TextBox2.Value
.Cells(dcc + 1, 4).Value = Me.TextBox3.Value
.Cells(dcc + 1, 5).Value = Me.TextBox4.Value
.Cells(dcc + 1, 6).Value = Me.TextBox5.Value

End With

With pfl
dcc = .Range("A" & Rows.Count).End(xlUp).Row

.Cells(dcc + 1, 1).Value = Date
.Cells(dcc + 1, 2).Value = Me.TextBox1.Value
.Cells(dcc + 1, 3).Value = Me.TextBox2.Value
.Cells(dcc + 1, 4).Value = Me.TextBox3.Value
.Cells(dcc + 1, 5).Value = Me.TextBox4.Value
.Cells(dcc + 1, 6).Value = Me.TextBox5.Value
 End With

 TextBox1.Text = ""
 TextBox2.Text = ""
 TextBox3.Text = ""
 TextBox4.Text = ""
 TextBox5.Text = ""

 End Sub

我可以分享工作表和用户表单的屏幕截图,以便更清楚地理解。我没有 Excel VBA 背景,因此说实话我很难解释这个问题。非常感谢您的帮助以及您的耐心。提前谢谢。干杯。

编辑:

好的,我按照@FreeMan 的建议进行了编辑(谢谢),并且我得到了以下信息:

Private Sub CheckBox1_Click()

If CheckBox1.Value = True Then Set abc = 
ThisWorkbook.Worksheets(Me.ComboBox1.Value)
Set pfl = Sheets("ProfitLoss")

With abc

 dcc = .Range("A" & Rows.Count).End(xlUp).Row

.Cells(dcc + 1, 1).Value = Date
.Cells(dcc + 1, 2).Value = Me.TextBox1.Value
.Cells(dcc + 1, 3).Value = Me.TextBox2.Value

End With


End Sub

好的,这有点用。它没有给出任何错误,我认为这总是一件好事!但是,它在 2019 年 1 月进行了重复输入。这可不酷。发生的事情是,我从 comboxbox1 中选择月份,假设是 2019 年 1 月,在注释中我写了租金,在租金中我输入 1,只要我单击复选框,该条目就会添加到 2019 年 1 月的工作表中,甚至在我单击 userform1 上的添加条目按钮之前。现在做同样的事情,就像我上面说的,然后我单击 userform1 上的添加条目按钮,然后它会在 2019 年 1 月和利润损失中进行输入。因此它可以工作,但是单击添加数据时会产生重复条目。

我 1000% 确定我搞砸了,我已经知道了!哈哈,但我不知道它是什么,也不知道如何阻止它在单击 checbox1 时输入数据。非常需要并感谢你的帮助。干杯。

答案1

经过几轮讨论和将评论移至聊天的建议后,在我看来,这就是你想要的:

Private Sub CommandButton1_Click()

  Dim dcc As Long
  Dim abc As Worksheet, pfl As Worksheet

  Set abc = ThisWorkbook.Worksheets(Me.ComboBox1.Value)
  Set pfl = Sheets("ProfitLoss")

  With abc
    dcc = .Range("A" & Rows.count).End(xlUp).row
    .Cells(dcc + 1, 1).Value = Date
    .Cells(dcc + 1, 2).Value = Me.TextBox1.Value
    .Cells(dcc + 1, 3).Value = Me.TextBox2.Value
    .Cells(dcc + 1, 4).Value = Me.TextBox3.Value
    .Cells(dcc + 1, 5).Value = Me.TextBox4.Value
    .Cells(dcc + 1, 6).Value = Me.TextBox5.Value
  End With

请注意这里的区别——我们只将项目移至损益表如果checkbox1 被选中

  If CheckBox1.Value Then 'this is a shorter way of writing the conditional
    With pfl
      dcc = .Range("A" & Rows.count).End(xlUp).row
      .Cells(dcc + 1, 1).Value = Date
      .Cells(dcc + 1, 2).Value = Me.TextBox1.Value
      .Cells(dcc + 1, 3).Value = Me.TextBox2.Value
      .Cells(dcc + 1, 4).Value = Me.TextBox3.Value
      .Cells(dcc + 1, 5).Value = Me.TextBox4.Value
      .Cells(dcc + 1, 6).Value = Me.TextBox5.Value
    End With
  End If

  TextBox1.text = ""
  TextBox2.text = ""
  TextBox3.text = ""
  TextBox4.text = ""
  TextBox5.text = ""

End Sub

几条代码注释:

  • worksheet声明变量并使用它们做得非常好!
  • 一条语句中有多个声明 ( abc& ) 。大多数人搞错了,只声明了最后一个声明的类型,而前面的声明则保留为。你也做对了!pflDimVariant
  • 您的变量名有点不尽如人意。
    • 未来的另一位程序员(甚至可能是未来的你)将很难理解这是什么abc意思。
    • 也许像selectedWorksheet,或者甚至更好(因为.SelectWorksheet方法)会是destinationWorksheetdesiredWorksheet。#NamingIsHard
    • pfl更多的显而易见,但可能还是难以理解profitAndLossSheet说出你的意思,并做到你所说的。
    • dcc似乎是最后使用的行,所以只需调用它lastRowlastUsedRow
    • #命名依然困难
  • 缩进代码。这样做更容易看到代码块的开始和结束位置。当代码缩进时,很容易跳过或错过某些内容不是缩进整齐。

相关内容