### Get the size of the area to process. my $min_row = get_min_row(); my $max_row = get_max_row(); ### Get something like D1-E23 my $range = "D$min_row:F$max_row"; my $selected_range = $sheet->Range($range); my $array_ref = $selected_range->{'Value'}; my $current_row = $min_row; foreach my $row_ref ( @$array_ref ) { ### Get values from columns, D, E, and F. my ( $d_val, $e_val, $f_val ) = @$row_ref; ### Do some stuff. if ( $d_val > 7 ) { my @array = split /$e_val/, $f_val; my $copied_range = "$current_row:$current_row"; foreach my $a ( @array ) { $sheet->rows($copied_range)->copy(); $sheet->Cells($current_row, 1)->EntireRow->Insert; $sheet->Range($copied_range)->select(); $sheet->Paste(); $sheet->Range("S" . $current_row)->{Value} = $a; } } $current_row++; ### This doesn't work. }