Хорошо, я новичок в этом сообществе, и мне помогли многие пользователи из других частей этого сайта. Я вчера отправил вопрос, и я еще не получил никакого ответа. Я просматривал сайт на предмет вопросов Excel VBA и наткнулся на это сообщество, и я подумал, что, возможно, разместил вопрос в неправильном разделе, так почему бы не попробовать здесь, и, возможно, кто-то отсюда может помочь мне в этом. Если это дублирующий вопрос, то я действительно извиняюсь за это.

У меня есть пользовательская форма, созданная с помощью нескольких пользователей этого сайта, и все функции работают так, как должно быть. Мне пришлось внести несколько изменений в один из листов, и теперь я застрял в том, как заставить его работать с новыми добавленными опциями. Это флажок1, который я добавил для пользовательской формы1, что, если и когда он будет нажат или проверен, данные из первых двух текстовых полей будут также скопированы на лист с именем profitloss (та же рабочая книга). 13 листов. 12 месяцев и один для прибыли. Мне нужен код VBA, чтобы заставить checkbox1 работать так, чтобы только при его проверке только тогда он копировал данные в убыток.

Если кто-нибудь может помочь с этим, я был бы очень признателен. В настоящем затруднительном положении здесь! и любая помощь очень полезна для достижения этой цели. Заранее спасибо. Код ниже, который находится в 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 года. Что не круто. Происходит следующее: я выбираю месяц в поле comboxbox1 и, скажем, январь 2019 года. В комментарии я пишу аренду, а в аренде - 1, и как только я нажимаю флажок, запись добавляется на листе января 2019 года, даже до того, как я нажимаю добавить кнопку ввода на userform1. Теперь то же самое, что я сказал выше, и затем я нажимаю кнопку «Добавить запись в userform1», тогда она делает запись в январе 2019 года, а также в «Прибыль». Так что это работает, но делает двойные записи, когда нажмите кнопку Добавить данные.

Я на 1000% уверен, что все испортил, я это уже знаю! LOL, но я не знаю, что это такое и как остановить ввод данных, как только нажмете checbox1. Ваша помощь очень нужна и ценится. Приветствия.

1 ответ1

0

После нескольких обходов и предложения переместить комментарии в чат, мне кажется, что это то, что вы хотите:

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

Обратите внимание на разницу - мы только перемещаем элементы на лист P/L, если установлен флажок1

  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 & pfl) в одном выражении Dim . Большинство людей путают это и объявляют тип только для последнего, оставляя более ранние как Variant . Вы тоже это правильно поняли!
  • Ваши имена переменных оставляют желать лучшего.
    • Другому программисту в будущем (возможно, даже в будущем вам) будет трудно понять, что означает abc .
    • Может быть , что - то вроде selectedWorksheet или даже лучше .Select метод Worksheet) будет destinationWorksheet desiredWorksheet или желаемым рабочим листом . #NamingIsHard
    • pfl более очевиден, но все еще тупой, возможно, profitAndLossSheet . Говори, что думаешь, и думай, что говоришь.
    • Кажется, dcc - последняя использованная строка, поэтому просто назовите ее lastRow или lastUsedRow
    • #NamingIsStillHard
  • Сделайте отступ в вашем коде. Гораздо проще увидеть, где блоки кода начинаются и заканчиваются, когда вы это делаете. Это действительно легко пропустить или пропустить вещи, когда код не имеет аккуратного отступа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .