Member 13003315 Ответов: 2

Перебрать ячейки серийно с различными значениями в Excel


Привет,
У меня есть ситуация, пожалуйста, помогите мне решить эту проблему.

У меня есть файл Excel с 2 листами, названными как

&Ампер лист1; Лист2

Лист1 имеет "вход" + "сложные формулы" = "результат" (опять же со сложными формулами) Столбцы
На самом деле дело в том, что лист1 имеет много сложных формул, и я получу какой-то результат, наконец, после множества вычислений

Лист 2 имеет только столбцы" входные числа "и" результаты".
Множество входных чисел(случайных), которые должны перейти в столбец ввода sheet1 один за другим, должны автоматически заполняться после результата этого ввода.

Лист прилагается в качестве справочного. Ссылка На Лист: Looping.xlsx - Google Sheets[^]

Спасибо.

Что я уже пробовал:

Я попытался написать макросы, используя для каждого цикла, который будет брать ячейку из диапазона, но он не будет получать результат с другого листа.


Sub test1_Click()
    Dim x As Integer
    
    Start_open = Sheet2.Range("A3").Value
    
    End_open = Sheet2.Range("A5").Value
    
    For x = Start_open To End_open
    
    Sheets("Sheet1").Name = "Sheet1"
    Range("A5").Select
    ActiveCell.Value = x
    
    
    
'    Z = 5
'    y = 3
'
'        For i = Start_open To End_open
'        Cells(Z, y) = i
'        Z = Z + 1
'
'        Sheets("Sheet2").Name = "Sheet2"
'        Range("C3").Select
'
'        Next
        
    'MsgBox x
    
    Next
    
End Sub

Maciej Los

Вопрос не ясен. Код, который вы пытаетесь понять, тоже не ясен. Можете ли вы предоставить более подробную информацию?

2 Ответов

Рейтинг:
1

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу. Комментарий к решению №1, предоставленному CHill60[^] тоже будет полезно.

Допустим, вы хотите записать 10 случайных чисел в Sheet1 но вы хотите получить минимальные и максимальные значения для рандомизации из листа 2.

Взгляните на пример:

'force explicit declaration of all variables in that module
Option Explicit

Sub WriteRandomNumbers()
'define variables for source and destination worksheets
Dim SrcWsh As Worksheet, DstWsh As Worksheet
'define min and max
Dim iMin As Integer, iMax As Integer
'random number
Dim rndValue As Integer
'iterator
Dim i As Integer

'on error got error handler
On Error GoTo Err_WriteRandomNumbers

'initiate variables
Set SrcWsh = ThisWorkbook.Worksheets("Sheet2")
Set DstWsh = ThisWorkbook.Worksheets("Sheet1")

iMin = SrcWsh.Range("A2")
iMax = SrcWsh.Range("B2")

'loop through cell 1 to 10 in Sheet1 - column A
For i = 1 To 10
    Randomize
    rndValue = Int((iMax * Rnd) + iMin)
    DstWsh.Range("A" & i) = rndValue
Next

'exis sub-programme
Exit_WriteRandomNumbers:
    'ignore errors
    On Error Resume Next
    'clean up!
    Set SrcWsh = Nothing
    Set DstWsh = Nothing
    Exit Sub

'error handler
Err_WriteRandomNumbers:
    'inform about error
    MsgBox Err.Description, vbExclamation, Err.Number
    'go to exit subroutine
    Resume Exit_WriteRandomNumbers
End Sub


Рейтинг:
0

CHill60

Непонятно, с какой стати вы попытаетесь переименовать листы внутри цикла - особенно на то же имя, что и они.

Если ваши листы называются чем-то иным, чем "Лист1", "Лист2" и т. д., то строка(ы), например

Sheets("Sheet1").Name = "Sheet1"
потерпеть неудачу. Если вы действительно хотите сделать что-то подобное, то используйте
Sheets(1).Name = "Sheet1"
(Обратите внимание, что листы Excel начинают нумерацию с 1, а не с 0, как сам VB)

Опять же, я не вижу, в чем проблема - потому что вы используете диапазон от Sheet2 в For цикл он получает значения из листа 2. Я предполагаю, что ваша проблема заключается в том, что все значения вставляются в ячейку A5 на листе 1. Если вы хотите продвигаться вниз по этому листу в цикле, то просто отрегулируйте ссылку диапазона, когда вы идете вот так
Sub test1_Click()
    Dim x As Integer
    
    Start_open = Sheet2.Range("A3").Value
    End_open = Sheet2.Range("A5").Value
    
    Sheets(1).Name = "Sheet1"
    
    Z = 5
    
    For x = Start_open To End_open
    

        Range("A" + CStr(Z)).Select
        ActiveCell.Value = x
        Z = Z + 1
   
    Next
    
End Sub
Если вы пытались поместить информацию где-то еще, например, на листе 3, то вам нужно активировать лист, прежде чем вы сможете его использовать.
Например, эта строка
Sheet3.Range("A" + CStr(Z)).Select
приводит к "ошибке, определяемой приложением или объектом", если вы также не включаете
Sheet3.Activate

Надеюсь, это поможет. Если нет, то используйте  У вас есть вопрос или комментарий?  ссылка рядом с этим решением, чтобы объяснить вашу проблему более подробно


Maciej Los

Кэролайн, я бы избегал употреблять Activate и Select! Когда есть некоторые события, связанные с листом или ячейками (диапазонами), это может привести к нескольким вычислениям и т. д. Другая проблема может заключаться в использовании ActiveCell без контекста. Z переменная - это тип Variant, но так и должно быть Integer или Long.
Видеть: Лучшие практики кодирования производительности Excel VBA

CHill60

Хорошие моменты, мой друг!