-
JavaFX表格控件TableView高级应用:自动添加ID列、删除操作列、单元格内容个性化渲染
2017-05-13 00:25:18数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法; 操作列(比如...问题描述
我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有:
- 数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法;
- 操作列(比如删除)的渲染问题,一种思路就是在表格控件之外加一个删除按钮,点击按钮的时候判断一下当前选中的行,然后执行删除操作。本文讨论另外一种思路,单独在表格里面添加一个删除列(每行都有一个删除按钮,单击则删除所在行数据);
- 很多时候,我们具有个性化显示表格数据的需求,比如,显示学生数学成绩的某列,我们希望把那些低于60分的分数标红,而及格分数则不做处理;
TableView理解
JavaFX表格控件渲染数据主要有两种方法:
1. setCellValueFactory(new PropertyValueFactory<>(“字段名”)),适合表格列数已知,有对应实体的情况(比如,学生信息,我们假定它只有姓名、性别、学号、地址、联系方式等固定字段,则适合采用此种方式进行渲染);
2. setCellValueFactory(new MapValueFactory<>(“对应列的键值”)),适合表格列数在渲染之前未知,需要根据传入数据的维数确定的情况,此时因为没有固定列数,所以一般数据也没有对应的实体类,数据需要用Map进行构造,一行数据就是一个Map;
本文主要针对列数已知的情况,Map的情况同理。代码DEMO
工程目录如下图:
Main.java
/** * 实现表格的序号列的计算填充, * 实现按钮操作列的正常显示以及事件绑定 */ package application; import java.io.IOException; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(this.getClass().getResource("FXTable.fxml")); // 为表格设置控制器 loader.setController(new TableController()); AnchorPane rootPane = loader.load(); Scene scene = new Scene(rootPane,506,460); primaryStage.sizeToScene(); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }
Student.java
package application; public class Student { private String firstName; private String lastName; private int age; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } }
TableController.java
package application; import java.net.URL; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.image.ImageView; public class TableController implements Initializable { @FXML private Label fxLabel; @FXML private TableView<Student> stuTable; @FXML private TableColumn<Student, String> idCol, fNameCol, lNameCol, delCol; @FXML private TableColumn<Student, Integer> ageCol; @FXML private TableColumn<Student, Boolean> isAdultCol; public ObservableList<Student> getStuData() { Student stu1 = new Student("赵", "哈", 16); Student stu2 = new Student("钱", "大", 26); Student stu3 = new Student("孙", "阿", 23); Student stu4 = new Student("李", "佛山", 17); Student stu5 = new Student("周", "阿萨德", 23); Student stu6 = new Student("吴", "更好", 12); Student stu7 = new Student("郑", "和", 28); Student stu8 = new Student("王", "费", 23); Student stu9 = new Student("刘", "的", 15); Student stu10 = new Student("关", "时是", 23); Student stu11 = new Student("张", "良好", 19); Student stu12 = new Student("诸葛", "列", 23); Student stu13 = new Student("司马", "咯跑", 20); ObservableList<Student> stuLists = FXCollections.observableArrayList(stu1, stu2, stu3, stu4, stu5, stu6, stu7, stu8, stu9, stu10, stu11, stu12, stu13); return stuLists; } /** * 显示学生表格 * * @param stuLists */ public void showStuTable(ObservableList<Student> stuLists) { fNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName")); lNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName")); // ageCol.setCellValueFactory(new PropertyValueFactory<>("age")); idCol.setCellFactory((col) -> { TableCell<Student, String> cell = new TableCell<Student, String>() { @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); this.setText(null); this.setGraphic(null); if (!empty) { int rowIndex = this.getIndex() + 1; this.setText(String.valueOf(rowIndex)); } } }; return cell; }); ageCol.setCellFactory((col) -> { TableCell<Student, Integer> cell = new TableCell<Student, Integer>() { @Override public void updateItem(Integer item, boolean empty) { super.updateItem(item, empty); this.setText(null); this.setGraphic(null); if (!empty) { int age = this.getTableView().getItems().get(this.getIndex()).getAge(); this.setText(String.valueOf(age)); if (age < 18) { this.getStyleClass().add("mark"); } } } }; return cell; }); isAdultCol.setCellFactory((col) -> { TableCell<Student, Boolean> cell = new TableCell<Student, Boolean>() { @Override public void updateItem(Boolean item, boolean empty) { super.updateItem(item, empty); this.setText(null); this.setGraphic(null); if (!empty) { CheckBox checkBox = new CheckBox(); this.setGraphic(checkBox); checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> { if (newVal) { // 添加选中时执行的代码 System.out.println("第" + this.getIndex() + "行被选中!"); // 获取当前单元格的对象 // this.getItem(); } }); } } }; return cell; }); delCol.setCellFactory((col) -> { TableCell<Student, String> cell = new TableCell<Student, String>() { @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); this.setText(null); this.setGraphic(null); if (!empty) { ImageView delICON = new ImageView(getClass().getResource("delete.png").toString()); Button delBtn = new Button("删除", delICON); this.setGraphic(delBtn); delBtn.setOnMouseClicked((me) -> { Student clickedStu = this.getTableView().getItems().get(this.getIndex()); System.out.println("删除 " + clickedStu.getFirstName() + clickedStu.getLastName() + " 的记录"); }); } } }; return cell; }); stuTable.setItems(stuLists); } @Override public void initialize(URL location, ResourceBundle resources) { fxLabel.setWrapText(true); fxLabel.setText(" javafx_Label标签的换行测试,用于弹出框的提示信息测试,Label控件也可以换行。"); this.showStuTable(this.getStuData()); } }
FXTable.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="461.0" prefWidth="489.0" stylesheets="@Fxtable.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> <children> <TableView fx:id="stuTable" layoutY="54.0" prefHeight="407.0" prefWidth="402.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="54.0"> <columns> <TableColumn fx:id="idCol" prefWidth="75.0" text="序号" /> <TableColumn fx:id="fNameCol" prefWidth="87.0" text="姓氏" /> <TableColumn fx:id="lNameCol" prefWidth="79.0" text="名字" /> <TableColumn fx:id="ageCol" prefWidth="73.0" text="年龄" /> <TableColumn fx:id="delCol" prefWidth="86.0" text="删除列" /> <TableColumn fx:id="isAdultCol" prefWidth="88.0" text="成年?" /> </columns> </TableView> <Label fx:id="fxLabel" layoutY="-1.0" prefHeight="56.0" prefWidth="402.0" /> </children> </AnchorPane>
运行截图:
实现描述:
- 实体类里面无ID字段,表格做数据展示的时候临时构造顺序ID列数据;
- 删除操作列的渲染,并且添加单击事件,能够实时响应删除动作;
- 年龄一列的个性化显示,未成年年龄显示为红色字体;
另,DEMO源码可以向我索要。
-
(转)JavaFX表格控件TableView高级应用:自动添加ID列、删除操作列、单元格内容个性化渲染
2018-11-30 14:08:16数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法; 操作列(比如...问题描述
我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有:数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法;
操作列(比如删除)的渲染问题,一种思路就是在表格控件之外加一个删除按钮,点击按钮的时候判断一下当前选中的行,然后执行删除操作。本文讨论另外一种思路,单独在表格里面添加一个删除列(每行都有一个删除按钮,单击则删除所在行数据);
很多时候,我们具有个性化显示表格数据的需求,比如,显示学生数学成绩的某列,我们希望把那些低于60分的分数标红,而及格分数则不做处理;
TableView理解
JavaFX表格控件渲染数据主要有两种方法:
1. setCellValueFactory(new PropertyValueFactory<>(“字段名”)),适合表格列数已知,有对应实体的情况(比如,学生信息,我们假定它只有姓名、性别、学号、地址、联系方式等固定字段,则适合采用此种方式进行渲染);
2. setCellValueFactory(new MapValueFactory<>(“对应列的键值”)),适合表格列数在渲染之前未知,需要根据传入数据的维数确定的情况,此时因为没有固定列数,所以一般数据也没有对应的实体类,数据需要用Map进行构造,一行数据就是一个Map;
本文主要针对列数已知的情况,Map的情况同理。代码DEMO
工程目录如下图:
Main.java/**
* 实现表格的序号列的计算填充,
* 实现按钮操作列的正常显示以及事件绑定
*/
package application;import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(this.getClass().getResource("FXTable.fxml"));
// 为表格设置控制器
loader.setController(new TableController());
AnchorPane rootPane = loader.load();
Scene scene = new Scene(rootPane,506,460);
primaryStage.sizeToScene();
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}public static void main(String[] args) {
launch(args);
}
}
Student.javapackage application;
public class Student {
private String firstName;
private String lastName;
private int age;public String getFirstName() {
return firstName;
}public void setFirstName(String firstName) {
this.firstName = firstName;
}public String getLastName() {
return lastName;
}public void setLastName(String lastName) {
this.lastName = lastName;
}public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}public Student(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
TableController.javapackage application;
import java.net.URL;
import java.util.ResourceBundle;import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;public class TableController implements Initializable {
@FXML
private Label fxLabel;
@FXML
private TableView<Student> stuTable;
@FXML
private TableColumn<Student, String> idCol, fNameCol, lNameCol, delCol;
@FXML
private TableColumn<Student, Integer> ageCol;
@FXML
private TableColumn<Student, Boolean> isAdultCol;public ObservableList<Student> getStuData() {
Student stu1 = new Student("赵", "哈", 16);
Student stu2 = new Student("钱", "大", 26);
Student stu3 = new Student("孙", "阿", 23);
Student stu4 = new Student("李", "佛山", 17);
Student stu5 = new Student("周", "阿萨德", 23);
Student stu6 = new Student("吴", "更好", 12);
Student stu7 = new Student("郑", "和", 28);
Student stu8 = new Student("王", "费", 23);
Student stu9 = new Student("刘", "的", 15);
Student stu10 = new Student("关", "时是", 23);
Student stu11 = new Student("张", "良好", 19);
Student stu12 = new Student("诸葛", "列", 23);
Student stu13 = new Student("司马", "咯跑", 20);ObservableList<Student> stuLists = FXCollections.observableArrayList(stu1, stu2, stu3, stu4, stu5, stu6, stu7,
stu8, stu9, stu10, stu11, stu12, stu13);
return stuLists;
}/**
* 显示学生表格
*
* @param stuLists
*/
public void showStuTable(ObservableList<Student> stuLists) {
fNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
lNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
// ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));
idCol.setCellFactory((col) -> {
TableCell<Student, String> cell = new TableCell<Student, String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
this.setText(null);
this.setGraphic(null);if (!empty) {
int rowIndex = this.getIndex() + 1;
this.setText(String.valueOf(rowIndex));
}
}
};
return cell;
});ageCol.setCellFactory((col) -> {
TableCell<Student, Integer> cell = new TableCell<Student, Integer>() {@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
this.setText(null);
this.setGraphic(null);if (!empty) {
int age = this.getTableView().getItems().get(this.getIndex()).getAge();
this.setText(String.valueOf(age));
if (age < 18) {
this.getStyleClass().add("mark");
}
}
}};
return cell;
});isAdultCol.setCellFactory((col) -> {
TableCell<Student, Boolean> cell = new TableCell<Student, Boolean>() {@Override
public void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
this.setText(null);
this.setGraphic(null);if (!empty) {
CheckBox checkBox = new CheckBox();
this.setGraphic(checkBox);
checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> {
if (newVal) {
// 添加选中时执行的代码
System.out.println("第" + this.getIndex() + "行被选中!");
// 获取当前单元格的对象
// this.getItem();
}});
}
}};
return cell;
});delCol.setCellFactory((col) -> {
TableCell<Student, String> cell = new TableCell<Student, String>() {@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
this.setText(null);
this.setGraphic(null);if (!empty) {
ImageView delICON = new ImageView(getClass().getResource("delete.png").toString());
Button delBtn = new Button("删除", delICON);
this.setGraphic(delBtn);
delBtn.setOnMouseClicked((me) -> {
Student clickedStu = this.getTableView().getItems().get(this.getIndex());
System.out.println("删除 " + clickedStu.getFirstName() + clickedStu.getLastName() + " 的记录");
});
}
}};
return cell;
});stuTable.setItems(stuLists);
}@Override
public void initialize(URL location, ResourceBundle resources) {fxLabel.setWrapText(true);
fxLabel.setText(" javafx_Label标签的换行测试,用于弹出框的提示信息测试,Label控件也可以换行。");this.showStuTable(this.getStuData());
}}
FXTable.fxml<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?><AnchorPane prefHeight="461.0" prefWidth="489.0" stylesheets="@Fxtable.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TableView fx:id="stuTable" layoutY="54.0" prefHeight="407.0" prefWidth="402.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="54.0">
<columns>
<TableColumn fx:id="idCol" prefWidth="75.0" text="序号" />
<TableColumn fx:id="fNameCol" prefWidth="87.0" text="姓氏" />
<TableColumn fx:id="lNameCol" prefWidth="79.0" text="名字" />
<TableColumn fx:id="ageCol" prefWidth="73.0" text="年龄" />
<TableColumn fx:id="delCol" prefWidth="86.0" text="删除列" />
<TableColumn fx:id="isAdultCol" prefWidth="88.0" text="成年?" />
</columns>
</TableView>
<Label fx:id="fxLabel" layoutY="-1.0" prefHeight="56.0" prefWidth="402.0" />
</children>
</AnchorPane>
运行截图:
实现描述:
实体类里面无ID字段,表格做数据展示的时候临时构造顺序ID列数据;
删除操作列的渲染,并且添加单击事件,能够实时响应删除动作;
年龄一列的个性化显示,未成年年龄显示为红色字体;
另,DEMO源码可以向原版作者要,以下链接是原文出处。
---------------------
作者:M-Chung
来源:CSDN
原文:https://blog.csdn.net/mrchung2016/article/details/71774496
版权声明:本文为博主原创文章,转载请附上博文链接! -
表格状态列_Excel小工具之04:批量自动删除状态为隐藏的列
2021-01-12 03:38:081. 问题的背景下面这样的一个表格是工作过程中常见的在这个表格中,列有不同的属性,同样表格,对于设计人员自身是应该全部可见,但是当需要把表格的部分内容分享给...因此,把需要隐藏的列删除是必要的。以下界面...1. 问题的背景
下面这样的一个表格是工作过程中常见的
在这个表格中,列有不同的属性,同样表格,对于设计人员自身是应该全部可见,但是当需要把表格的部分内容分享给业主,其他设计单位,供货商的时候,数据就需要有所取舍了,主要有两个方面的考虑,其一是保密的需要,有些数据不方便提供的,需要隐藏或者删除;其二则是有些数据对非设计人员没有用处,清除无关数据更方便对方使用。因此,把需要隐藏的列删除是必要的。
以下界面就十分清楚简单了
但是这样的表格还存在一个问题,就是可以通过右键取消隐藏,最好的办法是把不需要显示的数据列删除,问题是"公开"的列,"隐藏"的列,"保密"的列是离散分布的,手动删除的操作还是比较难以操作的。
最理想的是有一个所见即所得的功能,即当前界面调整完成后,自动的删除隐藏的状态的数据列。
2. 问题的解决
首先,运行《电气设计辅助程序(EDAP)正式版6.0@2019.03.03-02程序》
运行后在Excel界面出现如下选项卡:
点击通用工具
再选择单元工具,执行"删除隐藏的列"功能
并在对话框中输入当前表格最大的使用列数(为了避免遍历所有列,提高处理速度,可以输入一个足够大的数字即可)
点击确认即可完成操作。
公开的列依次变化为ABCDEFG,不需要出现的内容已经搞定。
-
删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...
2021-01-12 01:36:571 要解决的问题:删除某列中的空单元格/空行暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的1.1 需求分析用VBA删除如下内容,解决思路都不同删除1列的空行(本文要做的)...1 要解决的问题:删除某列中的空单元格/空行
暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的
1.1 需求分析
用VBA删除如下内容,解决思路都不同
- 删除1列的空行(本文要做的)
- 删除整个区域内的空行
- 删除整个区域内的空格(这个一般很少有这种需求,用处不大----可用currentregion .specialcells()解决)
- 下面是原始数据,下面看看如何处理
2 如果是删除全表/某区域的空单元格, 直接在当前列删除
简洁代码:删除区域内所有空单元格 cells ---实际需要少,so用处不大
使用 sheet.usedrange / region.currentregion .specialcells()
- 删除,表格页面内使用区域的空格所在的行
- 局限性就是表格的上方,左边还会存在一些空行空列,不过这个手动删下就可以了
- 这个只是删除了空的cells 并不是删除了空行
Sub 删空单元格()
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Delete
End Sub3 如果是删一列的空行
3.1 代码1:基础代码,假设确认知道这列的长度,关键是倒着删
- 熟悉 isempty() 或者用 if xxxx=""
- 删除单元格后,要设置属性 shift:=xlup等
- 需要倒着删除,否则会因为一边删除行,一遍重新排列有问题
Sub 删一列的空行()
For i = 20 To 1 Step -1 '需要倒着删除
If IsEmpty(Cells(i, 1)) Then
Cells(i, 1).Delete shift:=xlUp
End If
Next i
End Sub3.2 改进版: 先查这一列的非空最大行数
Sub jackma_delete_row()
For i = Range("c65536").End(xlUp).Rows To 1 Step -1
If IsEmpty(Cells(i, 3)) Then
rows(i).Delete shift:=xlUp
End If
Next i
End Sub3.3 也可以不用 isempty() 函数,直接判断 if cells()=""
- 直接判断 if cells(i,j) =""
- 这种删除整行不合适 rows(i) .delete,会影响其他列的元素
Sub ponyma_del_row1()
For i = Range("c65536").End(xlUp).Row To 1 Step -1
If Cells(i, 3) = "" Then
Cells(i, 3).Delete
' Rows(i).Delete
End If
Next i
End Sub4 不动原数据,将非空数据放到另外一列
4.1 错误版:
要明白“写入列”的循环数,明显和“输出列”的循环数 应该不同!
这么写相当于 输出列 那行为空的时候,只是不往 写入列写,所以没覆盖,也是空的
Sub jackma_delete_row2()
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(i, 9) = Cells(i, 3)
End If
Next i
End Sub4.2 正确版: 写入列/输出列,应该是单独的循环变量!
Sub jackma_delete_row2()
k = 1
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(k, 9) = Cells(i, 3)
k = k + 1
End If
Next i
End Sub5 先写入数组array中,再写到其他地方,据说这样能大幅提高速度!
把需要的筛选的数据,存在数据,然后从数组写到需要的地方,这是个好习惯
第1版:局限性很大,没有自动查这列的 元素个数,以及 最大非空行是多少
Sub 删除空格4()
Dim arr1() '定义了一个数组,并且是动态数组,因为没指定大小
ReDim arr1(11) '动态数组,使用前必须重新redim,数组大小
j = 0 'j=1开始,不会越界,但arr1(0)为空,因为赋值跳过了它
For i = 1 To 11 Step 1
If Not IsEmpty(Cells(i, 1)) Then
arr1(j) = Cells(i, 1)
j = j + 1
End If
Next i
For j = 0 To UBound(arr1())
Cells(j + 1, 9) = arr1(j) '单元格得从1开始,arr(),默认得从0开始,但可以改
Next j
End Sub第2版重写
注意debug.print用来监测的时候,需要注意,放在循环的位置,尤其是在k=K+1这种变化时,和放在哪个for循环之内外!
Sub ponyma_array22()
Dim arr1() '当数组定义,且默认开始的index为0! preserve时需要有0的index
'dim arr1 当变量定义
k = 1
m = 1
ReDim arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
For i = 1 To Range("c65536").End(xlUp).Row Step 1
If Cells(i, 3) <> "" Then
Debug.Print Cells(i, 3)
arr1(k) = Cells(i, 3)
Debug.Print arr1(k)
k = k + 1
' Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
' 循环是很精巧的,放的地方很讲究,放得不对,就错误百出
' Debug.Print arr1(k) 如果放在k=K+1 后,就看起来没打印出东西,因为都打印的arr1的空元素
End If
Next i
For j = 1 To UBound(arr1(), 1)
Cells(m, 10) = arr1(j)
m = m + 1
Next j
End Sub第3版
Option Explicit
Sub ponyma1()
Dim arr1()
Dim k1, k2, k
Dim i, j
k1 = WorksheetFunction.CountA(Range("a:a"))
k2 = Range("a65536").End(xlUp).Row
Debug.Print "这列非空数据个数k1=" & k1
Debug.Print "这列最后1个有数据的行数k2=" & k2
'arr1(0) = 1
'ReDim Preserve arr1(1, k)
'这样会越界,因为你需要preserve数据。但是index系不符合
'但是,如果不preserve 就无所谓
'或者虽然 dim arr1() 是动态数据从index0开始,但是arr1()一直为空,preserve也不会出现index越界问题
ReDim Preserve arr1(1 To k1)
'ReDim Preserve arr1(1, k1) 这样就会越界。。。因为语法是2维数组了!
'ReDim Preserve arr1(1 to k1) 这样就对的
k = 1
For i = 1 To k2
If Cells(i, 1) <> "" Then
arr1(k) = Cells(i, 1)
Debug.Print arr1(k)
k = k + 1
End If
Next i————————————————
版权声明:本文为CSDN博主「奔跑的犀牛先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:【原创】VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法
-
【原创】VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法
2018-10-19 12:19:28暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的 1.1需求分析 用VBA删除如下内容,解决思路都不同 删除1列的空行(本文要做的) 删除整个区域内的空行 删除整个... -
asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...
2021-01-15 10:18:48VBA编程经常和“对象”打交道,其中最频繁的对象大概就是“单元格”了。(听说您还没有对象?...1,当前表所有的单元格Cells.ClearContents 清空当前表所有单元格的内容2,当前活动单元格ActiveCell... -
MySQL删除自增索引_MySQL列的默认值主键索引与自增 删除增加与修改
2021-02-02 06:04:231. 某些列不插入内容,值是多少?自动填充NULL2. NOT NULL是干嘛的?不能为NULL类型,因为NULL类型查询的时候需要加语句 IS NULL 或者IS NOT NULL效率低,查询速度慢,开发中我们一般不可以设置为默认的能插入NULL类型... -
mysql增加列默认值_MySQL列的默认值主键索引与自增 删除增加与修改
2021-01-18 22:37:341. 某些列不插入内容,值是多少?自动填充NULL2. NOT NULL是干嘛的?不能为NULL类型,因为NULL类型查询的时候需要加语句 IS NULL 或者IS NOT NULL效率低,查询速度慢,开发中我们一般不可以设置为默认的能插入NULL类型... -
如何删除表格中一列重复值中的其他列值_Excel中去除重复项的几种情况,你一定会遇到!...
2021-01-28 19:01:14关于重复项,有整行内容重复的,也有部分内容重复的,就像下图左边的表格,有三个“张三”和两个“王五”,怎样变成右边那个没有重复项的表格呢?如果只有一部分列的内容重复,其他列的内容不重复的又怎么处理呢?... -
SQL SERVER 删除重复内容行
2020-12-15 05:16:471、如果这张表没有主键(或者相同的行并没有不相同的内容列),则需要新建一个自增列,用来区分不同列。例如 代码如下: alter table [tablename] add [TID] int IDENTITY(1,1) 就是增加一个自增量的临时列TID。 为啥... -
MySQL列的默认值主键索引与自增 删除增加与修改
2019-01-02 20:07:001. 某些列不插入内容,值是多少? 自动填充NULL2. NOT NULL是干嘛的? 不能为NULL类型,因为NULL类型查询的时候需要加语句 IS NULL 或者IS NOT NULL 效率低,查询速度慢,开发中我们一般不可以设置为默认的能插入... -
【excel技巧读书笔记011】删除空白列
2015-02-10 00:05:28一、定位 格式全选。TAB键将光标移到空列。Ctrl+G 定位工具 定位条件 行内容差异单元格。...2.定位 空值 填充1 (数据里没有的任何字符,便于区分)3.筛选1 删除 。4.复制,选择性粘贴 ,转置 。 转载于:ht... -
【列模式的使用】【选出具有特定内容的行】【复制bin文件视图】【bin文件添加或者删除字节】
2019-05-22 14:05:46这时候想把这些数据弄成一个C语言数组,这时候第一步看到最大的麻烦就是,这些数据之间都没有换行,这就十分的难弄,如果数据很多很多,那分行工作就十分的繁重,这时候就要想到使用工具了,这里先把这些数据弄成16... -
SQL SERVER删除重复内容行
2009-08-04 23:24:00刚解决的小问题,之前也解决过类似的问题,但这次还设计到用SQL语句加一列,平时不常用...1、如果这张表没有主键(或者相同的行并没有不相同的内容列),则需要新建一个自增列,用来区分不同列。例如alter table [tab -
datatable移动一列的位置
2019-08-24 18:22:48datatable中并没有直接可以使用的函数. 思路如下: ...3.依然使用datatable读取isFraud.csv的内容,然后在尾部追加isFraud列 代码如下: import datatable as dt folder_path = './' fraud_... -
如何在Exce中选择出重复内容,并将其删除?
2019-05-08 11:27:501、选中需要删除重复项的列,点击数据栏下的删除重复项 2、在弹出的删除重复项对话框中,选择需要处理的列后,点击确定;这时列已经变成没有重复项的列了 ... -
ListView隐藏列 column隐藏标题栏不被拉出的处理方法
2010-11-25 15:40:00想实现ListView在详细资料视图下列的隐藏,网上搜了一下实现方法,发现不外乎两种方法,一种是删除列,这是真正的隐藏...于是看第二种方法:把列宽设为0,这样看上去是隐藏了,也没有修改单元格内容的麻烦,但是用户拖 -
在data最后一列加上删除和修改按钮,自己加了之后一直报数据项错误,麻烦大佬们帮下忙?
2019-11-27 14:48:16在data最后一列加上删除和修改按钮,自己加了之后一直报数据项错误,麻烦大佬帮下忙 ``` <!DOCTYPE html> 二十九师信息 , initial-scale=1"> ... -
python咖啡名称提取_python – 提取包含特定名称的列
2021-01-29 16:44:50给定一个输入文件,称为“input.csv”,如下所示:A,B,c_net,d,e_net0,0,1,0,10,0,1,0,1(删除其间的空白行,它们只是用于格式化这篇文章中的内容)以下代码可以满足您的需求.import csvinput_filename = 'input.csv'... -
windows-clear-context-menu:清除上下文菜单的简单脚本(右键单击任何位置时列出)-源码
2021-02-13 21:17:50也为您的应用添加注册表并发送合并请求! 关于 这是我制作的一个简单脚本,用于清除安装新程序时添加的那些烦人的上下文菜单项,甚至不问您,而是在右键单击任何内容时显示... ...我没有安装脚本中列出的所有应用程序。 -
算法中显示行号_表格技巧—Excel 中删除筛选出来的行
2021-01-12 11:37:04首先,打开待处理的Excel表格工作薄,进入编辑状态,选中第一行,再选择“筛选”按钮,如图红色箭头所示:在筛选中,选择不想要的数据内容,如“水车”没有方量,想要全部删除,在B列强度等级中筛选内容窗口只勾选... -
删除Excel表格中一堆英文中的汉字
2019-03-08 19:49:00昨天需要处理一个Excel文件,删除一堆英文里的汉字,开始搜了下方法,没找到,然后手动一个多小时,弄了一半吧也就,结果电脑卡了,忘了保存,就白做了。...因为每个单元格内容太多,怕出错,就一列列处理的再放... -
如何删除 SQL Server 表中的重复行
2015-10-31 15:33:00第一种:有主键的重复行,就是说主键不重复,但是记录的内容重复比如人员表tab ,主键列id,身份证编号idcard当身份证重复的时候,保留最小id值的记录,其他删除delete a from tab a where exists(select 1 from tab... -
mysql多余_phpMyAdmin管理mysql中 “多余”这一列是做什么用的?
2021-02-07 10:40:25------ 2015年12月2日09:02:09 更新 ------------由于我没有深入研究过 MySQL 源码,以下内容纯属猜测。我看了你的截图,表都是 MyISAM 的。在第一次插入数据的时候,数据都是连续存储的(物理存储)。当 MySQL 删除... -
excel技巧——删除空白行
2019-12-13 17:34:49选择数据区域内容最多的一列(避免删除有用信息,因为有的列有部分值没有,但是这列数据依然有效) 按F5调出定位功能对话框 定位条件选择空值 然后在开始菜单中,找到删除 删除工作表行 ... -
python处理Excel~输出相同内容的序号(xlrd,xlwt)
2021-02-11 09:42:10然后第一行是题干,需要将第一行题干去掉,然后内容用双层for循环进行遍历,找到相同内容的题干号,从而删除相同的题号(目前没有尝试在python中删除内容相同的行,只是查询到,然后手动在Excel里面删除。... -
Linux 文件传输的所有内容
2018-04-14 14:10:55lprm 命令 Linux lprm命令用于将一个工作由打印机贮列中移除 尚未完成的打印机工作会被放在...这个命令会检查使用者是否有足够的权限删除指定的档案,一般而言,只有档案的拥有者或是系统管理员才有这个权限。 ...
-
数据分析师八大能力培养 Part3.定义问题能力.pdf
-
JMETER 性能测试基础课程
-
JVET-T2002-v2.docx VVC最新算法说明文档
-
MySQL 高可用工具 DRBD 实战部署详解
-
Servlet中response向浏览器输出数据
-
Liunx 优化思路与实操步骤
-
数据分析师八大能力培养 Part5 定义标准能力.pdf
-
CCF-CSP 201409-1 相邻数对 [C++]
-
牛牛量化策略交易
-
带头结点的循环上链表,判断是否对称
-
09.易课寄在线购课系统部署-CentOS6环境安装Dubbo
-
Flotherm学习教程.ppt
-
easy_en.dict.yaml
-
LeetCode-最小路径和
-
[转载]百度网盘通话记录快速自动删除
-
Unity RUST 逆向安全开发
-
HTML表格
-
马士兵 mybatis学习笔记
-
01-虚拟机的安装使用.pdf
-
消息队列