Fall 2012 Workshop
Revised: June 2014
George Zhao
george@georgegzhao.com
Goals of the Workshop
Learn Excel tools by utilizing them in various cases
Tools and materials covered here are merely a sample of
Excel functionality
Understand the logic and syntax behind Visual Basic
programming, which interacts with the Excel interface
No programming background required
Create dynamic algorithms to approach cases
When data is changed, but retains its original format,
the algorithm should be able to automatically handle the
transition appropriately
Created by George Zhao
2
Workshop Structure
Instead of providing function and programming
syntax to memorize, this workshop emphasizes case
studies, through which the skills are utilized
Cases: applicable situational tasks
Tutorials: supplemental teaching material to understand
foundational materials
Best recommended to follow along and do the
exercises with accompanying spreadsheets
Created by George Zhao
3
Workshop Resources
www.georgegzhao.com/excel.html
Lesson materials:
Learning Slides[.pdf]
Exercises

Blank [.xlsx]
Exercises

Filled [.xlsm]
Created by George Zhao
4
Contents Overview
Case 1: Multiplication Table
Case 2: Percentile Calculations
Tutorial 1: Variables and Arrays
Case 3: Hello World
Tutorial 2: Functions
Tutorial 3: Loops and Decisions
Case 4: Gradebook Tallying
Case 5: Loop through Data
Tutorial 4: Recording Macro
Case 6: Select, Pull, Display
Tutorial 5: Userform
Case 7: Subway Data All

Around Analysis
Created by George Zhao
5
Multiplication Table
Task: If given the following on an Excel worksheet,
how do we fill this up?
1
2
3
4
5
1
2
3
4
5
Created by George Zhao
7
First Task: Building the Table
Suppose we are only given one side of the table
initially:
We need 1, 2, 3, 4, 5 to be filled up on the top row,
beginning in cell B1, going rightward
We also want both sets of numbers to be bolded
Created by George Zhao
8
Shift + Control + Arrow
Begin by selecting cell B2
Shift + Control + Down arrow to select all elements
until an empty cell (or the end of capacity limit of the
worksheet) is reached
Shift + Control + (Up / Down / Left / Right) arrow all
work similarly
Control + B for bold
Control + C for copy
Created by George Zhao
9
Paste Special with Shortcut
Use arrow to move to cell B1
Can Right Click > Paste Special
Or simply Alt + E + S
Select Transpose (E)
Created by George Zhao
10
Where to Start
Use fixed reference cells
1
2
3
4
5
1
2
3
4
5
Created by George Zhao
11
1

Dimensional Fixed Reference
Example: y = (1+r)*x^2, given a fixed value r
r =
0.1
x
y

3
9.9

2

1
0
1
2
3
Created by George Zhao
12
Show Formulas
Formulas > Show Formulas
Toggle on and off between showing / not showing
Created by George Zhao
13
Error: No Fixing Reference
Error
r =
0.1
x
y

3
9.9

2
4

1
#VALUE!
0
0
1
5
2
#VALUE!
3
9
Created by George Zhao
14
1

Dimensional Fixed Reference
Fix cell reference in cells A1, B2, BB32: $A$1, $B$2,
$BB$32
r =
0.1
x
y

3
9.9

2
4.4

1
1.1
0
0
1
1.1
2
4.4
3
9.9
Created by George Zhao
15
Deeper Look into Fixing Reference
A1: not fixing column A nor row 1
$A$1: fixing column A and row 1
$A1: fixing ONLY column A, not row 1
A$1: fixing ONLY row 1, not column A
Whatever (row and/or column) right after the $ sign is
fixed
If fixing BOTH row and column, press F4 while cursor
is over the reference in the formula editing
Created by George Zhao
16
Algorithm: Multiplication Table
Multiply the row index by the column index
Do this for each cell in the row, and then for each row
1
2
3
4
5
1
2
3
12
4
5
Created by George Zhao
17
Example: Multiplication Table
Focus again on cell E4: (12 = 3 x 4)
All entries on row 4: product of 3 (A4) and ___
All entries on column E: product of 4 (E1) and ___
Created by George Zhao
18
Think About It
Focus on any single row:
We are traversing through various columns, but want to
fix the first term (A4), so fix the column letter (A)
Focus on any single column:
We are traversing through various rows, but want to fix
the second term (E1), so fix the row number (1)
Created by George Zhao
19
Result of Fixing
Fix the column (A) from the first reference, and the
row (1) from the second reference
F2 to illustrate the formula and the references
(colored)
Created by George Zhao
20
Shortcuts to Paste Formula
Double click on the square at the lower

right corner of
the cell
This pastes the formula down the column, avoids the
effort of dragging the formula down across rows
Created by George Zhao
21
Shortcuts to Paste Formula
columns
Have to manually drag it across the columns
Created by George Zhao
22
Performance Evaluation
How would performance have been if we were dealing
with a 50 x 50 table instead?
Shift + Control + Down, copy, paste special (transpose)
occurs constant time
Double clicking to paste to formulas down occurs
constant time
Manually dragging the formulas across columns
depends linearly on number of columns
Created by George Zhao
23
Alt + Enter Pasting Method
Paste the formula on one corner
Paste the formula on the other corner
Select all of the cells in

between to apply the same
formula, using Shift + Control + arrow to get all of the
wanted data
Click Alt + Enter
Much more useful when dealing with 1

dimensional
list than 2

dimensional table
Created by George Zhao
24
Alt + Enter Illustrated
Copy the formula in cell B2, paste into F6, select
everything in

between, and hit Alt + Enter
Difficult to capture the desired region efficiently with
the Shift + Control + arrow method
Created by George Zhao
25
Quick Way to Paste Formula
1
2
3
4
5
1
1
2
3
4
5
2
2
4
6
8
10
3
3
6
9
12
15
4
4
8
12
16
20
5
5
10
15
20
25
Created by George Zhao
26
Remarks
When fixing cell reference, think:
Are we fixing the column?
Are we fixing the row?
Both?
Neither?
Alt + Enter way to paste formulas is more useful in 1

dimensional situations
Created by George Zhao
27
Pseudocode: The Approach
Multiply the row index by the column index
Do this for each cell in the row, and then for each row
1
2
3
4
5
1
2
3
12
4
5
Created by George Zhao
28
Actual Code Juxtaposed
Multiply the row index by the column index
Do this for each cell in the row, and then for each row
Created by George Zhao
29
Task 1
We are given 20 x 10 matrix of all random numbers
Upon supplying various integer values between 0 and
100, denoted n, give the n

th percentile of each column
Created by George Zhao
31
=PERCENTILE()
=PERCENTILE([array], k)
Let k be within [0, 1]
=PERCENTILE(A1:A10, .75) gives the 75
th
percentile
value of the data from A1 to A10
=PERCENTILE(B1:B10, .05) gives the 5
th
percentile
value of the data from B1 to B10
Created by George Zhao
32
Right Formula?
Created by George Zhao
33
Need to Fix Reference
B1:B20
fix the row? Column? Both? Neither?
A23/100
fix the row? Column? Both? Neither?
Created by George Zhao
34
B1:B20
Stores the column of data points to be analyzed
Think of what happens when the formula is dragged
on to adjacent cells
DO NOT want to shift down to B2:B21 and so forth
fix the row references
But DO want shift right to C1:C20
do not fix the
column references
B$1:B$20
Created by George Zhao
35
A23/100
Stores the k value
Think of what happens when the formula is dragged
on to adjacent cells
DO want to shift down to A24
do not fix row
references
DO NOT want to shift right to B23
fix the column
references
$A23/100
Created by George Zhao
36
Refined Formula
Created by George Zhao
37
Dynamic Formulas
Results updates automatically for different k values
Created by George Zhao
38
Task 2
Given several integers, called x, calculate the percentile
rank of those integers
What percentile would these integers fit into?
If x is out of the range, error would return
=PERCENTRANK([array], x)
Created by George Zhao
39
Without Error Trapping
Similar cell reference fixing as previous
#N/A errors whenever:
x is smaller than the minimum value in the set
x is larger than the maximum value in the set
Created by George Zhao
40
=IF()
Returns different values given the certainty of a
condition
=IF([condition],[value if true],[value if false]
Suppose A2 wants to show the value in A1, but only the
value is divisible by 11, otherwise leave blank
=IF(MOD(A1,11)=0,A1,"")
Created by George Zhao
41
Nested =IF()
In cell A2, type =IF(MOD(A1,2)=0,IF(MOD(A1,3)=0,"DIV
BY 6","DIV BY 2"),"NOT DIV BY 2")
If divisible by 2:
If not divisible by 2:
Change the value in A1 and see the result
Created by George Zhao
42
=IFERROR()
=IFERROR([normal value], [value if error])
For B23 cell for example, we want
=IFERROR(PERCENTRANK(B$1:B$20,$A32),"Out of
Range")
Return PERCENTRANK(B$1:B$20,$A32) to B23 cell, but
instead
Created by George Zhao
43
=IFERROR() vs. =IF()
Logically,
=IFERROR(PERCENTRANK(B$1:B$20,$A32),"Out of
Range") is essentially this:
=IF(PERCENTRANK(B$1:B$20,$A32)=#N/A,"Out of
Range")
PERCENTRANK(B$1:B$20,$A32) immediately throws
So =IFERROR() is the only way to trap that error
Created by George Zhao
44
=IFERROR() vs. =IF()
=IFERROR() is also much cleaner
Suppose in cell row 39, we want to display sum of rows
1 through 20
instead of the actual sum
In B23 cell:
=IF(
SUM(B1:B20)
<1000,"< 1000",
SUM(B1:B20)
)

Created by George Zhao
45
=SUMIF()
In the previous example, output changed depending
on the final output
If the total final out is less than 1000, display the string
What if we want conditions for each entry?
In row 40, sum the entries of rows of 1 to 20, but only
each individual entry is greater than 70
Created by George Zhao
46
Criteria
Boolean condition within quotation marks
Examples:
=SUMIF(B1:B20, ">70") in this scenario
Created by George Zhao
47
A Note on This Exercise
No Visual Basic programming was needed for this
exercise
Most times, if a dynamic formula in a cell can give us
all the information we need, use them instead of
programs
Faster, easier debugging
Much of the functions and algorithms done with
formulas are the backbone for VBA programming
foundation
Created by George Zhao
48
Data
Data
Data
Data
Data
Created by George Zhao
50
Different types of data. Consider:
Name of city: New York (words)
Length of 14
th
St: 2.00 (decimal)
Population: 8,000,000 (integer)
MetroCard fare: 2.25 (currency)
Longitude: 74
°
Variables are categorized by the type of data they hold.
There are basic types, and there can be user

defined.
Created by George Zhao
51
Some Basic Variables
Consider a course:
Class size: 30 (integer)
Class location: Hamilton Hall (string)
Pass/Fail allowed: false (boolean)
Average grade: 94.4 (double)
Average letter grade: A (character)
Created by George Zhao
52
Declaring Variables
Dim size as Integer
Dim location as String
Dim passFail as Boolean
Dim avgGrade as Double
Dim ltrGrade as Char
Dim: denote local variables (existence in the running
of procedure)
Variable Names: begin with letter, only contain letter,
number, or underscore, cannot be reserved word
Created by George Zhao
53
Initializing Variables
Can do all the declaration in one line as follows:
Dim size as Integer, location as String, passFail as
Boolean, avgGrade as Double, ltrGrade as Char
size = 30
location = "Hamilton Hall"
passFail = False
avgGrade = 94.4
Created by George Zhao
54
Variants
Variables not restricted to specific type
No need to declare by type
size = 30
location = "Hamilton Hall"
passFail = False
avgGrade = 94.4
Created by George Zhao
55
Multiple Similar Variables
Suppose we want to store the price of pineapple for
each day of the week
We can declare 7 separate variables:
Difficult to keep track of all of the variables
Difficult to access each of the variables
Gets particularly difficult when the number of entries
grow higher
Created by George Zhao
56
Solution: Arrays
Array: block of pigeonholes
7 pigeonholes, each representing a day of week:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Index
0
1
2
3
4
5
6
Price
$5.03
$0.13
$1.51
$7.75
$7.24
$1.99
$0.64
Created by George Zhao
57
Arrays
Dim prices(6) as Double
prices(1)
to retrieve entry from index 1 (second entry)
prices(7)
will give out

of

bounds error
Benefit: the index can be accessed by other variables:
Dim i as integer
prices(i)
gives the (i+1)th entry
Created by George Zhao
58
Arrays
prices(0) = 5.03
prices(1) = 0.13
prices(2) = 1.51
prices(3) = 7.75
prices(4) = 7.24
prices(5) = 1.99
prices(6) = 0.64
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Index
0
1
2
3
4
5
6
Price
$5.03
$0.13
$1.51
$7.75
$7.24
$1.99
$0.64
Created by George Zhao
59
Multidimensional Array
Row x column
Dim matrix(1,2) as Integer
Creates 2x3 matrix with 2 rows, 3 columns
matrix(0,0)
matrix(0,1)
matrix(0,2)
matrix(1,0)
matrix(1,1)
matrix(1,2)
Created by George Zhao
60
Dynamic Array
Dim sample(9) as String
Creates string array of size 10
sample(0) = "Introduction"
Now suppose we want to increase the array size to 100
ReDim sample(99)
cell index 0
ReDim Preserve sample(99)
This preserves existing data and changes size
Created by George Zhao
61
Practice Exercise
Dim dat(2, 1)
dat(0, 0) = "Criterion"
dat(0, 1) = "Value"
dat(1, 0) = "Budget"
dat(1, 1) = 5123.21
dat(2, 0) = "Enough?"
dat(2, 1) = True
ReDim Preserve dat(2,1)
Created by George Zhao
62
Practice Exercise
Did you catch that: dat originally was 3x2 two

dimensional variant array? The very last line did
nothing since the new dimension is the same?
0
1
0
Criterion
Value
1
Budget
5123.21
2
Enough?
TRUE
Created by George Zhao
63
Excel Hierarchy
Created by George Zhao
65
Moments to Run Code
When user selects to run: modules
User runs the code to tally all the numbers
User runs the code to form a table from entries
Etc.
When some action is performed: worksheet and
workbook codes
Code is run when the workbook is opened
Code is run when the worksheet is modified
Etc.
Created by George Zhao
66
Note on Running VBA Codes
Programs updates automatically
programming languages
No undoing once programs are run and make changes
Highly recommend saving the file before running the
code
Even occasionally recommend saving a new copy of the
file to run the code on
Created by George Zhao
67
Worksheet Codes
Created by George Zhao
68
Most Important Key Sequence
To open the screen for Visual Basic editing from the
Excel workbook window:
ALT + F11
Created by George Zhao
69
ALT + F11
Created by George Zhao
70
Visual Basic Window
Each sheet has been set by default as an object
The workbook is also an object
Codes that runs when actions are performed, are
written from here
Created by George Zhao
71
Hello World
Double

Created by George Zhao
72
Hello World
Created by George Zhao
73
Hello World
Since we want code to run when this worksheet is
Created by George Zhao
74
Hello World
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Hello World"
End Sub

up box with the
Created by George Zhao
75
Hello World
Created by George Zhao
76
Other Worksheet Actions
Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
FollowHyperlink
PivotTableUpdate
SelectionChange
Created by George Zhao
77
Workbook Actions
Open: codes to be run when the workbook opens
Created by George Zhao
78
Practice Exercise
Suppose you want a pop

want a pop

any calculations are performed on Sheet1.
Created by George Zhao
79
Practice Exercise
ThisWorkBook > WorkBook > Open:
Private Sub Workbook_Open()
MsgBox "Welcome to the Database!"
End Sub
Sheet1 > WorkSheet > Calculate:
Private Sub Worksheet_Calculate()
MsgBox "Are you sure?"
End Sub
Created by George Zhao
80
A Word on Functions
Excel has pre

defined function, including:
=SUM() returns the sum of an array of numbers
=AVERAGE() returns the average value of an array of
number
Etc.
We can write, define, and use our own functions
For example, a function that takes an array of numbers,
and returns the product of the maximum value and the
minimum value
Created by George Zhao
82
Intro to Modules
Subroutines (Sub)
Piece of code that perform a set of actions or
calculations or a combination of the two
Does not return a value
Functions
Exactly like a subroutine except returning a value
Think of f(x, y, z)
Can have as many inputs, but returns one value
Created by George Zhao
83
Function Example
Suppose given three digits a, b, c, return the number
abc
If digits 4, 5, 6 are passed, the function returns 456
Algorithm: 100*a+10*b+c
Created by George Zhao
84
Module
Can no longer write codes under the worksheet objects
Right

click Sheet > Insert > Module
Created by George Zhao
85
Concat
Function Concat(a, b, c)
Concat = 100 * a + 10 * b + c
End Function
Function name equals the value to be returned
Created by George Zhao
86
Using Functions in Excel
You can use this user

defined function in Excel cells,
just like how you use =sum() or =average()
Created by George Zhao
87
Concat(3, 4, 5)
Should return 345
And indeed it does
Created by George Zhao
88
Practice Exercise 1
Without using pre

existing Excel functions, write your
own function that does the following:
Take in 2 integers
Raise the first integer to the power of the second integer
Take that result and modulo by the second integer
Return this final result
Recall: a modulo b is the remainder after a / b,
performed in VBA via
a Mod b
Created by George Zhao
89
Practice Exercise 1
Function Special(a, b)
Special = (a ^ b) Mod b
End Function
In A1 cell, can type =special(2,3)
Upon hitting enter, 2 would show up in A1
2^3 = 8, and 8 mod 3 = 2
Created by George Zhao
90
Practice Exercise 2
Without using pre

existing Excel functions, write your
own function that does the following:
Take in a string and an integer
Return true or false
as to whether the length of the
string is equal to the integer
Note: the function
Len(string_variable)
returns the
length of string_variable as an integer
Created by George Zhao
91
Practice Exercise 2
Function takes in two variables:
A string
An integer
Need to compute the length of the string
Need to compare the length of the string, to the
integer
Return whether or not (true or false) the two values are
equal
Created by George Zhao
92
Practice Exercise 2
Function StrLength(a, b)
Length = Len(a)
StrLength = (Length = b)
End Function
Note that (Length = b) is a boolean statement. It is
either true or false.
=strlength("abc",4) returns FALSE
=strlength("abc",3) returns TRUE
Created by George Zhao
93
Loops and Decisions
Loops:
For
While
Do Until
Decisions:
If statements
Entries in [ ] is optional
Created by George Zhao
95
Sample Exercise
Cells(1,1) = 1
Cells(2,1) = 2
Cells(3,1) = 3
Cells(1000,1) = 1000
Created by George Zhao
96
For Loop Syntax
For
Row = 1
To
1000
Cells(Row, 1) = Row
Next
Row
For [variable name] = [start] To [end]
Next [variable name]
Created by George Zhao
97
Same Exercise: While Loop
Row = 1
While
Row <= 1000
Cells(Row, 1) = Row
Row = Row + 1
Wend
While [conditional statement]
Wend
Created by George Zhao
98
Common Fatal Error: While Loop
Row = 1
While Row <= 1000
Cells(Row, 1) = Row
Row = Row + 1
Wend
We have to do that on our own for While loop
Created by George Zhao
99
Do Until
Similar to While loop
Row = 1
Do Until Row=1000
Cells(Row, 1) = Row
Row = Row + 1
Loop
Created by George Zhao
100
Word on Loops
Usually interchangeable
Choice of which loop to use usually coming down to
personal preference
For loop usually best when the number of iterations
are known
Created by George Zhao
101
If Statements
Display in column B whether each integer is divisible
by 2, 3, both, or neither
both 2 and 3
Created by George Zhao
102
Algorithm Approach
If divisible by 6, note it
Recall: a Mod b gives the remainder of a / b
In another words, a is divisible by b if a Mod b = 0
Created by George Zhao
103
The Code
For Row = 1 To 1000
If Cells(Row, 1) Mod 6 = 0 Then
Cells(Row, 2) = "Divisible by 6"
ElseIf Cells(Row, 1) Mod 2 = 0 Then
Cells(Row, 2) = "Divisible by 2"
ElseIf Cells(Row, 1) Mod 3 = 0 Then
Cells(Row, 2) = "Divisible by 3"
End If
Next Row
Created by George Zhao
104
If Ladder
Ladder ends with EndIf
Within a ladder, as long as the first satisfying
condition is met, other conditions are ignored and
Created by George Zhao
105
Think About It
What will happen after this switch or ordering?
For Row = 1 To 1000
If Cells(Row, 1)
Mod 2
= 0 Then
Cells(Row, 2) = "Divisible by
2
"
ElseIf
Cells(Row, 1)
Mod 3
= 0 Then
Cells(Row, 2) = "Divisible by
3
"
ElseIf
Cells(Row, 1)
Mod 6
= 0 Then
Cells(Row, 2) = "Divisible by
6
"
End If
Next Row
Created by George Zhao
106
Think About it
Take the number 12:
Since it 12 % 2 = 0, satisfying the first condition, will
Instead, breaking this ladder into multiple different If
statements works successfully
Created by George Zhao
107
Hypothetical Revision
If Cells(Row, 1) Mod 2 = 0 Then
Cells(Row, 2) = "Divisible by 2"
End If
If Cells(Row, 1) Mod 3 = 0 Then
Cells(Row, 2) = "Divisible by 3"
End If
If Cells(Row, 1) Mod 6 = 0 Then
Cells(Row, 2) = "Divisible by 6"
End If
Created by George Zhao
108
Remember This?
Nested for loop
Created by George Zhao
109
Task
Suppose this grading scheme:
With the caveat that up to 2 assignments can be
dropped
Compute the overall grade
Assignment
Weight
Points
Total
HW 1
10%
Quiz 1
15%
HW 2
10%
Quiz 2
15%
Test 1
20%
HW 3
10%
Test 2
20%
Created by George Zhao
111
Illustration
For example, if Quiz 1 and Test 1 are dropped:
35% of the assignments are dropped
HW 1 is now worth (10%) / (1
Assignment
Weight
Points
Total
HW 1
10%
Quiz 1
15%
HW 2
10%
Quiz 2
15%
Test 1
20%
HW 3
10%
Test 2
20%
Created by George Zhao
112
Approach
Take into consideration:
Varying total points for assignments
Unexpected position of empty slots
Assignment
Weight
Points
Total
HW 1
10%
18
20
Quiz 1
15%
10
HW 2
10%
43
50
Quiz 2
15%
23
24
Test 1
20%
50
HW 3
10%
9
20
Test 2
20%
49
50
Created by George Zhao
113
Approach
Calculate grade for each assignment
If score cell is empty, keep track of the weight of the
assignment
Need Excel functions:
Determine if cell is empty
Return different depending on whether or not another
cell is blank
Created by George Zhao
114
Useful Excel Functions
=IF() in Excel
=IF([boolean statement], [value if true], [value if false])
=ISBLANK() in Excel
=ISBLANK([cell reference])
Returns TRUE or FALSE
If A1 is empty, =ISBLANK(A1) returns TRUE
Created by George Zhao
115
Approach
If no points are listed in the POINTS column, a grade
should not be calculated: not 0%!
Assignment
Weight
Points
Total
Grade %
HW 1
10%
18
20
90.00%
Quiz 1
15%
10
HW 2
10%
43
50
86.00%
Quiz 2
15%
23
24
95.83%
Test 1
20%
50
HW 3
10%
9
20
45.00%
Test 2
20%
49
50
98.00%
Created by George Zhao
116
Approach
column. Otherwise, give the result of points / total
Created by George Zhao
117
Approach
Multiply each assignment grade by the assignment
weight, sum the product
Normalize the overall weight, to take into
consideration dropped assignments
Assignment
Weight
Points
Total
%
HW 1
10%
18
20
90.00%
Quiz 1
15%
10
HW 2
10%
43
50
86.00%
Quiz 2
15%
23
24
95.83%
Test 1
20%
50
HW 3
10%
9
20
45.00%
Test 2
20%
49
50
98.00%
Sum:
56.08%
Normalized Sum:
86.27%
Created by George Zhao
118
Calculation
10%
* 90% +
10%
* 86% +
15%
* 95.83% +
10%
* 45% +
20%
* 98% = 56.08%
56.08% / (100%

15%

20%) = 86.27%
Assignment
Weight
Points
Total
%
HW 1
10%
18
20
90.00%
Quiz 1
15%
10
HW 2
10%
43
50
86.00%
Quiz 2
15%
23
24
95.83%
Test 1
20%
50
HW 3
10%
9
20
45.00%
Test 2
20%
49
50
98.00%
Sum:
56.08%
Normalized Sum:
86.27%
Created by George Zhao
119
=SUMPRODUCT(): cross product
10%
* 90% +
10%
* 86% +
15%
* 95.83% +
10%
* 45% +
20%
* 98% = 56.08%
Numbers in red represent the weights, multiplied by
its corresponding grade %
We multiply each weight by its corresponding %, and
tally them: cross product of vectors in calculus
Created by George Zhao
120
Normalized Sum
56.08% / (100%

15%

20%) = 86.27%
Assignment
Weight
Points
Total
%
HW 1
10%
18
20
90.00%
Quiz 1
15%
10
HW 2
10%
43
50
86.00%
Quiz 2
15%
23
24
95.83%
Test 1
20%
50
HW 3
10%
9
20
45.00%
Test 2
20%
49
50
98.00%
Sum:
56.08%
Normalized Sum:
86.27%
Created by George Zhao
121
Normalized Sum
Added Column F to display the weight of the
assignment, if there is no grade for that
Created by George Zhao
122
Programming Approach
We already have the algorithms down
Just need to translate to VBA codes
Given the following structure to begin with:
Created by George Zhao
123
Psuedocode
Start from row 2
Traverse down the rows, as long as there is an
assignment
For each row, compute % if there is a score
Otherwise, keep track of the weight, to be backed out
later
Sum

Divide Sum by (100%

backed out weights) for
normalized sum
Created by George Zhao
124
The Code
Sub Tally()
Row = 2
BackedOut = 0
Sum = 0
While Cells(Row, 1) <> ""
If Cells(Row, 3) <> "" Then
Sum = Sum + Cells(Row, 2) * Cells(Row, 3) / Cells(Row, 4)
Else
BackedOut = BackedOut + Cells(Row, 2)
End If
Row = Row + 1
Wend
Cells(2, 9) = Sum / (1

BackedOut)
End Sub
Created by George Zhao
125
Set

Up
Sub Tally()
Row = 2
BackedOut = 0
Sum = 0
Start from row 2
Sum and weights to back out begin with 0
Created by George Zhao
126
Loop Running Condition
While Cells(Row, 1) <> ""
known as cellA2
words, the cell contains something
Created by George Zhao
127
Normal Entries
If Cells(Row, 3) <> "" Then
Sum = Sum + Cells(Row, 2) * Cells(Row, 3) / Cells(Row, 4)
If content of column C for each row is empty, then:
Sum is the previous sum + (weight of assignment) *
(points earned on assignment)/ (total number of
points)
Created by George Zhao
128
Empty Entries
Else
BackedOut = BackedOut + Cells(Row, 2)
End If
Otherwise, the weight of that assignment entry
(column 2) is tallied
EndIf to denote the end of an If statement block
Created by George Zhao
129
Traversing
Row = Row + 1
Wend
Cells(2, 9) = Sum / (1

BackedOut)
Cells(2, 9).NumberFormat = "0.00%"
End Sub
Move onto the next row
Wend to denote the end of a While loop
End Sub to denote the end of the Subroutine
Created by George Zhao
130
Remarks
This code can handle any number of assignment
entries in this format
Takes one click to run the program
Created by George Zhao
131
Refer to Excel Data
Created by George Zhao
133
Task
Give the percentage of days in which the stock index
(S&P 500) closed above the previous day
entries for this exercise of computing daily changes
Accommodate the algorithm for future entries to be
added below
Perform the task without programming, and then with
programming
Created by George Zhao
134
Algorithm Reasoning
Otherwise, return 0
Drag the formula down to the penultimate entry
Sum up column C, divided by the number of entries in
column C
Created by George Zhao
135
No Programming
Created by George Zhao
136
Programming Reasoning
For loop would not be appropriate, since the number
While loop or Do Until loop
Similar reasoning as the non

programming approach
Created by George Zhao
137
While Loop
Row = 2
Sum = 0
Total = 0
While Cells(Row,1) <> ""
If Cells(Row,2) > Cells(Row+1,2) Then
Sum = Sum + 1
End If
Total = Total + 1
Row = Row + 1
Wend
Cells(Row

1,3) = ""
Cells(2,5) = (Sum

1) / (Total

1)
Created by George Zhao
138
ActiveCell
ActiveCell, as the name suggests, refers to the
currently selected cell
ActiveCell.Value returns the value of the current cell
Say cell B4 is to be selected:
Cells(4,2).Select
ActiveCell.Value now returns the value of cell B4
Created by George Zhao
139
Offset
Very important function used both in programming
and functions
[Original cell].Offset([rows], [columns])
Cells(2,2).Offset(1,1) returns Cells(3,3)
Cells(2,2).Offset(3,0) returns Cells(5,2)
Cells(2,2).Offset(

1,1) returns Cells(1,3)
ActiveCell.Offset(1,0).Select
Select the cell one row beneath, in the same column
Potential for loops?
Created by George Zhao
140
Offset Looping
Given rows of entries, begin with cell A1 and loop
down the rows, until there are no more entries
Range("A1").Select
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Offset(1,0).Select
Loop
Created by George Zhao
141
Try With This
Use offset function in program
Created by George Zhao
142
Programming
Range("B2").Select
Sum = 0
Total = 0
Do Until IsEmpty(ActiveCell.Value)
Total = Total + 1
If ActiveCell.Value > ActiveCell.Offset(1,0).Value Then
Sum = Sum + 1
EndIf
ActiveCell.Offset(1,0).Select
Loop
Range("E2").Value = (Sum
1) / (Total
1)
Created by George Zhao
143
Unlike Other Programming Lang.
give the code (macro) that, once upon run, would
perform the same actions
But what about tweaking a mini detail?
Challenge then becomes deciphering the codes, to
adapt to similar but different scenarios
Therefore, still important to learn VBA
Created by George Zhao
145
Sorting
Refer to Excel file
Wish to sort by values in column B, smallest to largest,
expanding the selection
Easy to perform manually
Record macro to see the syntax to automate the action
Record macro
Perform action manually
Stop macro
Read macro code
Created by George Zhao
146
Record Macro
Essentially subroutines
Created by George Zhao
147
View Macro Codes
Created by George Zhao
148
Look at the Codes
Columns("B:B").Select
ActiveWorkbook.Worksheets
("Tutorial 4").
Sort.SortFields.Clear
ActiveWorkbook.Worksheets
("Tutorial 4").
Sort.SortFields.Add
Key:=Range("B1") _
,
SortOn
:=
xlSortOnValues
, Order:=
xlAscending
,
DataOption
:=
xlSortNormal
With
ActiveWorkbook.Worksheets
("Tutorial 4").Sort
.
SetRange
Range("A1:B20")
.Header =
xlNo
.
MatchCase
= False
.Orientation =
xlTopToBottom
.
SortMethod
=
xlPinYin
.Apply
End With
Created by George Zhao
149
Pick Out Characteristics
Columns("
B:B
").Select
ActiveWorkbook.Worksheets("Tutorial 4").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tutorial 4").Sort.SortFields.Add
Key:=Range("
B1
") _
, SortOn:=xlSortOnValues, Order:=
xlAscending
,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tutorial 4").Sort
.SetRange Range("
A1:B20
")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Created by George Zhao
150
Expanded Exercise
Suppose in a table of data, spanning from columns A
to E, rows 1 to 100, sort by values in column A
Replace references of column B with column A
Created by George Zhao
151
Tasks Recording Macro Can Teach
Inserting row
Hiding a sheet
Formatting cell text to be italic, red, and value
displayed as percentage
Copying, cutting, pasting
Moving selection to the top row of a table entry
Defining a formula in a cell
RC format just like offset
Created by George Zhao
152
RC Reference: Row / Column
Let cell C3 be value of A1 squared
In the worksheet, formula of C3 would be: =A1^2

However, functions without treating A1 as hard

coded.
formula updates accordingly

right cell (while in
C3) is more like: =OFFSET(C3,

2,

2)^2
Now no reference of A1 necessary
Both works fine
Created by George Zhao
153
RC Reference: Row / Column
In VBA, only the equivalent of =OFFSET() works
Select cell A1 and record this macro:
Type 3 in A1
Stop macro
ActiveCell.FormulaR1C1 = "3"
Range("C3").Select
ActiveCell.FormulaR1C1 = "=R[

2]C[

2]^2"
Range("C4").Select
Created by George Zhao
154
Defining Function in VBA
Look at this line of code:
ActiveCell.FormulaR1C1 = "=R[

2]C[

2]^2"
ActiveCell can be substituted for other equivalents:
Cells(2,3)
ActiveCell.Offset(1,2)
Range("F5:G9")
Range("F5:G9").Offset(10, 10)

2]C[

Offset from current cell, 2 rows above and 2 columns left
Created by George Zhao
155
Note on Recording Macro
Should not be substituted for learning code syntax
Useful tool to learn the syntax
Need to understand the algorithm of the codes, in
order to know how and where to change the recorded
codes to fit in the specific task
This workshop will not be able to cover all types of
scenarios in Excel, but knowing how to approach new
problems is the most crucial component of problem
solving
Created by George Zhao
156
Google Finance Data
Created by George Zhao
158
Task
Create a customized data, whereby the user can enter
and change 5 selected dates
For those 5 dates, the customized data would pull all of
the data to display from the original table
For those 5 dates, make a bar graph, with the Opening
and Closing values displayed on top of another for
each date
When the user changes the dates, the customized
table and graphs should update automatically
Created by George Zhao
159
Algorithm
Need a function that would take a value (user

inputted
date) and search for that value within a bigger table
=VLOOKUP() very useful when data is presented row

by

row
For example, if the look

Looks through the master table, looking for the row
Function can return specific column entry
=HLOOKUP() not used as often, for when each data
entry presented column

by

column
Created by George Zhao
160
=VLOOKUP()
=VLOOKUP(I2,A1:F31,2,FALSE)
I2 is the look

up value
A1:F31 is the master table to search from
2 signifies return the 2
nd
column value from master table
FALSE means return only exact results (TRUE would
yield approximate result when no exact result is found)
Created by George Zhao
161
=VLOOKUP()
Created by George Zhao
162
Fixing Some References
down to the following row:
A1:F31 reference gets shifted
columns and rows
Fix both the row and column: $A$1:$F$31
Dragging across column, the look

up value reference
gets shifted
We want to only fixed the column reference, not the row
reference
Fix just the column: $I2
Created by George Zhao
163
Refined Formula
=VLOOKUP($I2,$A$1:$F$31,2,FALSE)
Created by George Zhao
164
Problem
Upon dragging the formula to the right, nothing
changes
Need to change the 2 in the formula to 2, 3, etc.
Created by George Zhao
165
Possible Solutions
Manually change
If the customized table will not be moved, can use a
function that determines the current column value,
and rearrange accordingly
=COLUMN() returns the column number of the cell
Column A returns 1
Column B returns 2
Etc.
Created by George Zhao
166
As It Stands
=VLOOKUP($I2,$A$1:$F$31,
2
,FALSE)
=VLOOKUP($I2,$A$1:$F$31,
3
,FALSE)
=VLOOKUP($I2,$A$1:$F$31,
4
,FALSE)
=VLOOKUP($I2,$A$1:$F$31,
5
,FALSE)
=VLOOKUP($I2,$A$1:$F$31,
6
,FALSE)
Created by George Zhao
167
Use =COLUMN()
Column J is really column 10
Column K is really column 11
Column L is really column 12
Column M is really column 13
Column N is really column 14
In all cases, COLUMN()

8 would give the appropriate
number to incorporate into the formula
Created by George Zhao
168
Refined Formula
Created by George Zhao
169
Improvement
=VLOOKUP() returns #N/A error is the look

up value
is not found in the original table
We can error trap using =IFERROR() function
=IFERROR([value if no error], [value if error])
is no data
In cell J2, to be dragged in both directions:
=IFERROR(VLOOKUP($I2,$A$1:$F$31,COLUMN()

8,FALSE),"***NO DATA***")
Created by George Zhao
170
Refined Table
Manually efficient
Dynamic
Created by George Zhao
171
Bar Chart
Select the customized table, and choose bar graph
for
Created by George Zhao
172
We can manipulate a lot about the chart
Right click > Select Data
Created by George Zhao
173
End Result
Series
Categories
0
500
1000
1500
2000
2500
3000
7/20/2012
7/18/2012
6/25/2012
6/24/2012
6/18/2012
Close
Open
Created by George Zhao
174
Series and Categories
Categories: different entries of similar types
Date 1, date 2, etc.
Product 1, product 2, etc.
Each of the 5 dates selected in the customized table
Series: different types of values for each entry
High temp and low temp for each day
Number of hits and number of homeruns for each
baseball player
Opening Price and Closing Price for each of the 5 days
Created by George Zhao
175
Series
Series 1 value: cell range containing opening prices
Series 2 value: cell range containing closing prices
Created by George Zhao
176
Category
Select the 5 dates
Created by George Zhao
177
Probably See This Initially
0
500
1000
1500
2000
2500
3000
6/18/2012
6/19/2012
6/20/2012
6/21/2012
6/22/2012
6/23/2012
6/24/2012
6/25/2012
6/26/2012
6/27/2012
6/28/2012
6/29/2012
6/30/2012
7/1/2012
7/2/2012
7/3/2012
7/4/2012
7/5/2012
7/6/2012
7/7/2012
7/8/2012
7/9/2012
7/10/2012
7/11/2012
7/12/2012
7/13/2012
7/14/2012
7/15/2012
7/16/2012
7/17/2012
7/18/2012
7/19/2012
7/20/2012
Close
Open
Created by George Zhao
178
The Problem
Axis is arranged numerically, treating the dates on a
continuous spectrum
We want discrete spectrum, treating the dates not as
numerical, but as text
Right click axis > Format Axis > Axis Type: Text Axis
Created by George Zhao
179
Created by George Zhao
181
Message Box
MsgBox "Message Body", vbInformation, "Optional
Title Goes Here"
Created by George Zhao
182
Message Box Icon Displays
MsgBox "Message Body",
vbCritical
, "Optional Title
MsgBox "Message Body",
vbQuestion
, "Optional Title
MsgBox "Message Body",
vbExclamation
, "Optional
Title Goes Here"
Created by George Zhao
183
Multi

Option Message Box
Will then use If

Else ladders to determine the course of
action
Created by George Zhao
184
Yes or No
response
= MsgBox("Choose yes or no",
vbYesNoCancel
,
"Choices")
If response =
vbYes
Then
MsgBox "You clicked yes"
ElseIf response =
vbNo
Then
MsgBox "You clicked no"
Else
MsgBox "Why can't you follow directions?"
End If
Created by George Zhao
185
Customized Userform
Begin by inserting a blank userform
Created by George Zhao
186
Blank Userform
Created by George Zhao
187
Remember this Slide?
Created by George Zhao
188
Userform Hierarchy
Book1 (.xls file)
Userform1
Lablel1
ComboBox1
TextBox1
Created by George Zhao
189
Properties Tab
Important to keep track of for what the information is
relating to: Userform1? Label1?
Created by George Zhao
190
Label
Create event

driven programs (much like worksheet
programs, running when the Excel book opens, etc)
Created by George Zhao
191
Useful Controls in the Toolbox
Label
Clicking it can enable some codes of action
TextBox
Users can enter text into the box, that can be read into
codes
ComboBox
Users choose one of several determined options, and the
selection can be read into codes
Created by George Zhao
192
Continued
ListBox
Similar to ComboBox, but multiple columns allowed
CheckBox
Useful for boolean (true / false) conditions
OptionBox
Can only choose one option, given multiple
Rather than demonstrating the use for each, why not
delve right into a case example to see how it works
Created by George Zhao
193
MTA Subway Ridership Data
http://www.mta.info/nyct/facts/ridership/ridership_s
ub_annual.htm
Created by George Zhao
195
Pasting Data into Excel
Directly copying, and pasting into Excel may or may
not function, depending on the version of the software
If dysfunctional:
Copy from website
Paste into Notepad
Copy from Notepad
Paste into Excel
Created by George Zhao
196
Task Bundle 1: Clean the Data
The station name and the numerical data are off

aligned by one row (besides the first entry)
Fix this
Add an identifier to each row designating which
borough the station is from
Can do this manually

Yankee Stadium B train icon D

Created by George Zhao
197
Adding Identifier
Insert blank column to the left of column A
Type the borough name, and drag it down until the
end of the list for that borough
Since there are only 4 boroughs (Staten Island not part

time
step completely manually
Need to recognize when to perform tasks manually vs.
investing in the time to write functions or programs
Created by George Zhao
198
Off

Align
For each station:
Take the numerical data, and move them up one row
Delete the row where the data used to reside in
Do this for all stations in the borough
Do this for the other boroughs
This process needs to be done for all of the 400+
stations, so definitely an automated process is better.
Created by George Zhao
199
Excel Sheet At the Moment
Created by George Zhao
200
PsuedoCode

Have a variable that tracks the number of boroughs
processed
Run the program in a loop until all 4 boroughs are
traversed through:
For each station, copy the numerical data, and then
delete the row with that data
End of a section of boroughs is reached when value in
column A is empty
Delete that row and continue on
Created by George Zhao
201
The Codes
Sub Align()
Range("A5").Select
boroughsTraversedThrough = 0
Do Until boroughsTraversedThrough = 4
For i = 2 To 9
Range(ActiveCell.Offset(0, i), ActiveCell.Offset(0, i)) = Range(ActiveCell.Offset(1, i),
ActiveCell.Offset(1, i))
Next i
Rows(ActiveCell.Row + 1).Delete Shift:=xlUp
ActiveCell.Offset(1, 0).Select
If IsEmpty(ActiveCell.Value) Then
Rows(ActiveCell.Row).Delete Shift:=xlUp
boroughsTraversedThrough = boroughsTraversedThrough + 1
End If
Loop
End Sub
Created by George Zhao
202
Processed Data
All entries on one row, with the borough identified
Clean transition from borough to borough
Created by George Zhao
203
Small Manual Cleanup
Delete the original row 3
Created by George Zhao
204
Station Name Processing

Yankee Stadium B train icon D train

Yankee Stadium [B, D, 4]
Useful ideas:
Whether B or 4, the identifier is 1 character
Loop through column B and do this processing for all
entries
Created by George Zhao
205
InStr Function
within a larger string
InStr( [start], string, substring, [compare] )
InStr("161 St

Yankee Stadium B train icon D train icon 4
train icon", "train icon")
returns 25 (first instance)
InStr(
26
, "161 St

Yankee Stadium B train icon D train icon
4 train icon", "train icon")
returns 38 (second instance)
InStr(
52
, "161 St

Yankee Stadium B train icon D train icon
4 train icon", "train icon")
returns 0 (none found
anymore)
Created by George Zhao
206
Mid Function
Similar to substring() function in Java
2 is the start position (starts counting from 1, not 0)
3 is the length to extract
If the second number is not specified, assumes rest of
the string
Created by George Zhao
207
Psuedocode
For all entries (station names) in column B:
Start with position 1, and run Instr() function search in
Loop through the text until Instr() function returns 0
Record the letter / number (B, 4, etc), which is always
two spaces to the left of the Instr() value given
Search again, except starting from the Instr() value + 1,
Retain the station name, and add the appropriate
brackets syntax
Created by George Zhao
208
The Code
Sub NameProcess()
Range("B3").Select
Do Until IsEmpty(ActiveCell.Value)
fullText = ActiveCell.Value
startPosition = 1
bracketedText = "["
Created by George Zhao
209
The Code
While InStr(startPosition, fullText, "train icon") <> 0
result = InStr(startPosition, fullText, "train icon")
bracketedText = bracketedText & Mid(fullText, result

2,
1) & ", "
startPosition = result + 1
Wend
Created by George Zhao
210
The Code
stationName = Left(fullText, InStr(fullText, "train icon")

3) & bracketedText
stationName = Left(stationName, Len(stationName)

2)
& "]"
ActiveCell.Value = stationName
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Created by George Zhao
211
Looks Much Better
Task bundle 1 complete!
Created by George Zhao
212
Task Bundle 2: Extreme Trends
Identify the stations that has had, over the span of the
data:
Decreasing ridership in each successive year
Increasing ridership in each successive year
Summarize in a condensed table, the percentage of stations in
each borough that satisfied this quality
Largest percentage increase in ridership
Largest percentage decrease in ridership
Created by George Zhao
213
Strategy
For stations with increasing ridership in each
successive year:
Value in column G > value in column F
AND column F > column E
AND column E > column D
AND column D > column C
Created by George Zhao
214
AND Operator
In VBA programming:
But in Excel cells:
Created by George Zhao
215
Decreasing and Increasing
Created by George Zhao
216
Borough Tally Chart
Count the number of total entries
=COUNTA([Range])
Row ranges of the boroughs can be hard

coded, since

items
Created by George Zhao
217
Different COUNT Methods
Empty vs. blank
=COUNT([Range])
Cells that contain numbers
=COUNTA([Range])
Cells that are not empty
=COUNTBLANK([Range])
Cells that are blank
=COUNTIF([Range], [Condition])
Cells that satisfy the condition
Created by George Zhao
218
Results Table
Created by George Zhao
219
Determining Max / Min Change
Create a new column (column R) that calculates the %
change in ridership from 2011 to 2007
Determine the max and min from the column, and
determine the station name for those rows
Created by George Zhao
220
Error Trap
Even with a calculation as simple as percentage
change: (G3

C3)/C3
Having #DIV/0! Error will not allow for further
calculations, such as the max and min
=IFERROR((G3

C3)/C3,"")
Created by George Zhao
221
Problem with =VLOOKUP()
Suppose we wanted to use this:
=VLOOKUP(MAX(R3:R423),A3:R423,2,FALSE)
After all, the station name is in column B (second
column)
column of the search table
very last column
Created by George Zhao
222
Offset?
Can we locate the row containing the max value, and
then use offset to move over to the correct column?
=OFFSET() needs a reference cell
Unfortunately, =VLOOKUP() returns only the value,
not the reference
Need a function that returns a reference in an array,
given a lookup value
Created by George Zhao
223
=MATCH()
=MATCH([lookup value], [lookup array], [match
type])
0 as the match type for exact match
Created by George Zhao
224
Back to Determining Max / Min
First create a column to house the numerical max and
min values
Think about it:
=OFFSET() needs a baseline reference, and two
directions to branch out to
=MATCH() needs a data set, and returns a subsequent
reference
Any way to use both simultaneously?
Created by George Zhao
225
Work from Inside Out
MATCH(U2,$R$3:$R$423,0)
Returns n, where the max value is the n

th entry in the
numerical data in column R
Or, think of it as the number of row to offset down from
R2
Created by George Zhao
226
What We Want
We want the station name (column B)
Recall from previous slide: MATCH(U2,$R$3:$R$423,0)
is the number of row to offset down from R2
What about the number of columns?

16 (with reference at column R, column B is 16 columns
to the left)
So the overall formula we want is:
=OFFSET($R$2,MATCH(U2,$R$3:$R$423,0),

16)
Created by George Zhao
227
Task Bundle 3: Select Numbers
Create an userform that allows the user to input two
numbers to create a range
Allow for blank entries for unbounded
Pull all of the name of stations whose 2011 ridership
was between the user

chosen range
Given the stations that fall into this criteria, create a
chart sorting the stations by boroughs
Even though the second task did not specify that the
borough be pulled also, it may seem helpful to do that as
well, given this final task
Created by George Zhao
228
Userform Design
Which option in the Toolbox would be the most
helpful?
We want a form with the following features:
Text to display directions
Label merely with text
Two boxes for users to type numbers
TextBox
Button for user to click when done
Label with an option to run more programs when clicked
Created by George Zhao
229
Userform Design
Created by George Zhao
230
Programs for Clicking
Private Sub Label4_Click()
End Sub
Need to write codes here:
Look through column G (2011 ridership stat) and find
entries who value is between the range
Deal with unbounded values
Paste the station and borough name down column X
and Y (arbitrarily chosen: merely our next empty
columns)
Created by George Zhao
231
Unbounded Values
If TextBox1.Value is blank, we could set it to 0
Similarly, if TextBox2.Value is blank, set to some
enormous number like 999,999,999
In general, this is not a good practice, especially when
But the benefit is simplicity: otherwise we need more
If

Else for when they are blank
Since we roughly know the range of data here,
acceptable to hardcode the values here
Created by George Zhao
232
Unbounded Values
Private Sub Label4_Click()
If TextBox1.Value = "" Then
Min = 0
Else: Min =
1#
* TextBox1.Value
End If
If TextBox2.Value = "" Then
Max = 999999999
Else: Max =
1#
* TextBox2.Value
End If
Created by George Zhao
233
Quick Review & Important Note
In the previous slide, we would not have been able to
use IsEmpty in replace of
TextBox1.Value = ""
By inputting nothing, we entered a blank entry, but
not an empty entry
1# * TextBox1.Value
* because otherwise, it would treat TextBox1.Value as a
text, not number, and make inequity impossible to
check
Created by George Zhao
234
Traversing Data
We could use ActiveCell and Offset to traverse down
column G until ActiveCell is empty
pasting into column X and Y (24 and 25)
currentRow = currentRow + 1
Range("G3").Select
currentRow = 1
Created by George Zhao
235
Traversing Data
Columns("X:Y").Clear
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value >= Min And ActiveCell.Value <= Max
Then
Cells(currentRow, 24) = ActiveCell.Offset(0,

6)
Cells(currentRow, 25) = ActiveCell.Offset(0,

5)
currentRow = currentRow + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
Created by George Zhao
236
Auto Fit Column & Hide Form
UserForm1.Hide
End Sub
Recording a simple macro can give the necessary
syntax for the auto

fitting
After recording the macro, recognize the need to
change the parameters to columns X and Y
Able to add other customization (font size, cell style,
etc) this way (recall the tutorial on Recording Macros)
Created by George Zhao
237
To Run This
Recall these codes are within the userform
We need the userform to be displayed
We can write a short code for that
Then simply assign an object (text box, etc) to run that
short code upon being clicked
Sub Show()
UserForm1.Show
End Sub
Created by George Zhao
238
Assign Macro to Objects
Created by George Zhao
239
Final Task: Design the Chart
Part one: pull data
Take the data from column X and Y (only really need X)
Count the frequency for each borough
Paste the frequency by borough in columns AA and AB
Part two: create the chart
Create pie chart using the data in columns AA and AB
Record the macro to determine the formatting syntax
Data for the data will have fixed size
easier to automate
Created by George Zhao
240
Pull Data
Use =COUNTIF() method for each borough
Look up the borough names in column X
Efficient coding:
only difference of the borough name
To avoid writing similar codes, use arrays to store the
borough names
Created by George Zhao
241
Create Chart
Record a macro and manually create the desired chart
2
10
50
16
Ridership between 5000000 and 20000000
The Bronx
Brooklyn
Manhattan
Queens
Created by George Zhao
242
Recording Macro
Range("AA1:AB4").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData
Source:=Range("'Case
7'!$AA$1:$AB$4")
ActiveChart.ChartType
=
xlPie
ActiveChart.SeriesCollection
(1).Select
ActiveChart.SeriesCollection
(1).
ApplyDataLabels
ActiveChart.ChartArea.Select
ActiveChart.SetElement
(
msoElementChartTitleCenteredOverlay
)
ActiveChart.ChartTitle.Text
=
"Ridership between " & Min & "
and " & Max
Created by George Zhao
243
Assignments
Short mini case studies, demonstrating the use of
Excel and VBA to handle data in different ways
Includes function syntaxes as references
More information includes than needed
Need to discern which functions will be useful in each
case
Snippets of each assignment shown in the following
Created by George Zhao
245
Assignment 1
At a fair, the participants were asked to input their
name in the first column and their Columbia University
UNI on the second column of an Excel document. Write
the codes in VBA that can complete the task of
can be bundled together into one text, which can be
directly pasted into an email to send out to all
Created by George Zhao
246
Assignment 2
Excel worksheet. Participants may have used different
cases of letters or added spaces between the words, but
they refer to same entry. For example, the following
Write the codes in VBA that will create a sorted tally
table that displays the distinct entries with their count
Created by George Zhao
247
Assignment 3
Suppose that at an institution, the unique ID code for
each student is comprised of two letters (use lower

case
in this exercise) of the alphabet, followed by one, two,
or three digits of numbers. If two or more digits are
present in the ID, the numerical portion of the ID will
Write a VBA that will generate all of the combinations
Created by George Zhao
248
Final Marks
This workshop was designed to give an overview of
some of the noteworthy functions and the foundations
of VBA programming.
There are many more functionalities in Excel. One can
always learn more by browsing through the functions
list or searching for them online. For VBA, one can
always record some macros.
Having a solid foundation enables one to more easily
learn new essentials.
Created by George Zhao
249