Найдите последнюю строку, которая не имеет данных, но имеет формулу в excel, используя VBA [duplicate]

Что такое виртуальный деструктор или как использовать виртуальный деструктор

Деструктор класса - это функция с тем же именем класса, предшествующего ~, который перераспределит память, выделенную классом. Почему нам нужен виртуальный деструктор

См. Следующий пример с некоторыми виртуальными функциями

В примере также рассказывается, как вы можете преобразовать букву в верхнюю или нижнюю

#include "stdafx.h"
#include
using namespace std;
// program to convert the lower to upper orlower
class convertch
{
public:
  //void convertch(){};
  virtual char* convertChar() = 0;
  ~convertch(){};
};

class MakeLower :public convertch
{
public:
  MakeLower(char *passLetter)
  {
    tolower = true;
    Letter = new char[30];
    strcpy(Letter, passLetter);
  }

  virtual ~MakeLower()
  {
    cout<< "called ~MakeLower()"<<"\n";
    delete[] Letter;
  }

  char* convertChar()
  {
    size_t len = strlen(Letter);
    for(int i= 0;i

Из приведенного выше примера вы можете видеть, что деструктор для класса MakeUpper и MakeLower не вызывается.

См. следующий пример с виртуальным деструктором

#include "stdafx.h"
#include

using namespace std;
// program to convert the lower to upper orlower
class convertch
{
public:
//void convertch(){};
virtual char* convertChar() = 0;
virtual ~convertch(){}; // defined the virtual destructor

};
class MakeLower :public convertch
{
public:
MakeLower(char *passLetter)
{
tolower = true;
Letter = new char[30];
strcpy(Letter, passLetter);
}
virtual ~MakeLower()
{
cout<< "called ~MakeLower()"<<"\n";
      delete[] Letter;
}
char* convertChar()
{
size_t len = strlen(Letter);
for(int i= 0;i

Виртуальный деструктор будет вызывать явно самый производный деструктор времени выполнения класса, чтобы он мог корректно очищать объект.

Или посетите ссылку

https: / /web.archive.org/web/20130822173509/http://www.programminggallery.com/article_details.php?article_id=138

2
задан Community 9 July 2018 в 18:41
поделиться

3 ответа

Если вы хотите найти последнюю строку, содержащую непустое значение (полученное формулой или путем ввода константы), попробуйте это

Sub FindLastValue()
Dim jLastRow As Long
jLastRow = ActiveSheet.Cells.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Sub
3
ответ дан Charles Williams 15 August 2018 в 17:10
поделиться
  • 1
    Одна возможная опасность, в зависимости от того, какое поведение вы ожидаете, если ваши последние строки будут отфильтрованы, эта формула не будет считать их. – WoodenKitty 2 May 2013 в 06:14
  • 2
    Он не работает с заполненными формулой столбцами. Он идентифицирует последнюю строку с формулой. – Jovica 15 November 2017 в 12:35
  • 3
    @Jovica - Зависит от того, что возвращает формула: она игнорирует формулы, возвращающие & quot; & quot; но находит формулы, возвращающие " & Quot; или "& quot;" – Charles Williams 15 November 2017 в 15:56

Вот простой способ найти последнюю ячейку в столбце, который не содержит формулу. Это будет 0, если нет ячейки без формулы.

Sub Test()

Dim i As Long, tempLast As Long, lastRow As Long
tempLast = Range("A" & Rows.Count).End(xlUp).Row

For i = tempLast To 1 Step -1
    If Len(Cells(i, 1)) <> 0 Then
        If Not Cells(i, 1).HasFormula Then
            lastRow = i
            Exit For
        End If
    End If
Next

MsgBox lastRow
End Sub

Обратите внимание, что вы должны использовать «rows.count», а не 65536, поскольку это уже не последняя строка в более новых версиях Excel , Rows.count работает независимо от версии или пользовательских настроек. Userange также следует избегать, так как есть странная ошибка, в которой вам нужно обновить usedrange или вы получите ошибочные результаты.

2
ответ дан aevanko 15 August 2018 в 17:10
поделиться
  • 1
    Я думаю, что вопрос заключается в том, как найти последнюю формулу, которая приравнивается к & quot ;. – Doug Glancy 18 December 2011 в 09:14
  • 2
    О, крысы, я должен был неправильно понять это. Я полагаю, вы можете просто поменять & lt; & gt; for = и удалите 'Not' внутри моего кода, чтобы достичь этого. – aevanko 18 December 2011 в 12:55

Я никогда не делал ничего подобного, но, похоже, он работает правильно и быстро для довольно больших площадей. Несмотря на то, что вы сказали, что столбец - это все формулы, это учитывает сочетание значений и формул, таким образом, внешний цикл переходит назад через области:

Function GetLastFormulaBlank(rngInput As Excel.Range) As Excel.Range

Dim rngFormulas As Excel.Range
Dim rngArea As Excel.Range
Dim CellCounter As Long
Dim AreaCounter As Long
Dim varAreaCells As Variant
Dim rngLastFormulaBlank As Excel.Range

Set rngFormulas = rngInput.SpecialCells(xlCellTypeFormulas)
For AreaCounter = rngFormulas.Areas.Count To 1 Step -1
    Set rngArea = rngFormulas.Areas(AreaCounter)
    varAreaCells = rngArea.Value2
    If IsArray(varAreaCells) Then
        For CellCounter = UBound(varAreaCells) To LBound(varAreaCells) Step -1
            If varAreaCells(CellCounter, 1) = "" Then
                Set rngLastFormulaBlank = rngArea.Cells(CellCounter)
                Exit For
            End If
        Next CellCounter
    Else
        If varAreaCells = "" Then
            Set rngLastFormulaBlank = rngArea.Cells(1)
        End If
    End If
    If Not rngLastFormulaBlank Is Nothing Then
        Exit For
    End If
Next AreaCounter

Set GetLastFormulaBlank = rngLastFormulaBlank
End Function

Вы бы назвали это следующим образом:

Sub test()
Dim rngLastFormulaBlank As Excel.Range

Set rngLastFormulaBlank = GetLastFormulaBlank(ActiveSheet.Range("A:A"))
If Not rngLastFormulaBlank Is Nothing Then
    MsgBox rngLastFormulaBlank.Address
Else
    MsgBox "no formulas with blanks in range"
End If
End Sub
2
ответ дан Doug Glancy 15 August 2018 в 17:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: