As a Chemical Engineer with a Six Sigma Black Belt, I bring a strong foundation in process optimization and a quantitative approach to decision making to my roles as an Operations Analyst and Process Engineer. My degree in chemical engineering has provided me with a process-oriented mindset, which has been invaluable in my efforts to improve efficiency and drive positive results in various operations.

I have extensive experience with Power BI, SQL, and advanced Excel, which I have utilized to drive data-driven decision making and identify trends and patterns in data. In my previous roles, I have successfully implemented 5S methodologies to streamline workflows and reduce waste, and have a track record of identifying and addressing bottlenecks in production processes, resulting in increased output and improved quality.

In addition to my technical skills and experience, I am an exceptional team player with strong interpersonal skills. I have a proven ability to build and maintain positive professional relationships, which has been instrumental in my success in driving process improvements and optimizing operations. I am a natural communicator and excel at explaining technical concepts in a clear and concise manner, making it easy for team members and stakeholders to understand and buy into my ideas. I am also skilled at facilitating group discussions and collaboration, ensuring that all team members are heard and that the best ideas are brought to the forefront.

My ability to build strong relationships with my colleagues and stakeholders has allowed me to successfully gain buy-in for my initiatives, which has in turn enabled me to implement changes more quickly and effectively.

I am highly organized and efficient, and have extensive experience in collecting and analysing production data to inform decision making and project future performance. I am skilled in defining and tracking Key Performance Indicators (KPIs) to monitor the effectiveness of operations and identify areas for improvement. I am also skilled in using data visualization tools such as Power BI to clearly communicate findings and recommendations to management.

Overall, my combination of technical expertise, analytical skills, and exceptional interpersonal and team skills make me a valuable asset to any organization. I am confident in my ability to contribute to the success of your team and drive positive results for your company. If you have any questions or want to discuss any opportunities further, please don't hesitate to contact me.

Customer Database Upgrade

Data Extraction, Validation, & Modernisation of an Obsolete & Non-Uniform Database

Quality Checking Sheet

Operator Periodic Quality Check Form & Performance Record 

SCOPE

Conducted within my role as Operations Analyst @ Veolia

The sales and transport teams had been 

The database that was employed used Microsoft Excel, however it did not present records in a logical manner;

OLD SYSTEM PICTURE HERE 

ANALYSIS 


 METHODOLOGY

 

Used VBA script to extract a list of all sheet names and print in new spreadsheet = site name

 

Sub ListSheetNamesInNewWorkbook()

Dim objNewWorkbook As Workbook

Dim objNewWorksheet As Worksheet

 

Set objNewWorkbook = Excel.Application.Workbooks.Add

Set objNewWorksheet = objNewWorkbook.Sheets(1)

 

For i = 1 To ThisWorkbook.Sheets.Count

        objNewWorksheet.Cells(i, 1) = i

        objNewWorksheet.Cells(i, 2) = ThisWorkbook.Sheets(i).Name

Next i

 

With objNewWorksheet

      .Rows(1).Insert

      .Cells(1, 1) = "INDEX"

      .Cells(1, 1).Font.Bold = True

      .Cells(1, 2) = "NAME"

      .Cells(1, 2).Font.Bold = True

         .Columns("A:B").AutoFit

End With

End Sub


 

 

Next begun count of number of each shed number on every sheet

 

             =SUMPRODUCT(COUNTIF(INDIRECT(SHEETNAME!A1:Z10000),SHED ##) and referenced the sheet name to search for specific shed number ##

 

Dragged across with search cell reference changing on each column

 

Returned count value

 

Used conditional formatting to visualise data and identify gaps / duplicates - manually assessed these incidences – e.g. row 24 had “SHED 3” twice, corrected this number to 4 shed count

             =LOOKUP(2,1/(C2:AF2<>0),$C$1:$AF$1) to look backwards and identify last (first encountered) value greater than 0 and identify corresponding column heading from first row (shed number)

 

The above printed e.g. "SHED 11"

 

             =NUMBERVALUE(RIGHT(AK2,2)) To extract from text

“11”

Some #N/A values, so

 

             =IF(ISNUMBER(AL2),AL2,"")

 

Copied number of sheds into database

 

Used conditional formatting to block off extra sheds (0-30 sheds allowed)


 

--- INFO EXTRACTION ---

 

Address info always in cells A2, A3, A4, A5

 

Extracted each line from sheet using INDIRECT, checked ISTEXT

 

Copied into ADDR1 ADDR2 ADDR3 ADDR4

 

Contact name extracted from usual cells, validated using ISTEXT

 

Also copied contact information using the above technique, however the cell reference for these varied and so multiple instances were run in parallel (e.g. E1, F1) and ISNUMBER validation was used to remove "Mobile" and "Telephone" headings from results.

 

As Telephone was always recorded on the 3rd row, and Mobile on 2nd row, I simply varied the column letter to locate the contact details. This method was also used to extract contact names ISTEXT

This method was also used to extract lines of notes below the data, which typically began on row 21.

Here I used the formula on 5 rows beginning at row 21 to ensure nothing was missed

 

For the numerical data – SQFT SQMTR KG/1000 (spread depth) – I noticed that they also occurred at varying heights in typically the same column – C, E, and G respectively. Therefore I ran my incremental row data retrieval formulae sheet with the correct row selected, and TRUE FALSE validation for each variable ISNUMBER and a range of acceptable values (i.e) Spread depth would be acceptable 0 < KG/1000 < 200 -  this avoided accidental entry of an incorrect value.

 

Finally I needed to retrieve the shed sizes from rows 12 / 13, with varying columns according to shed number. I did all Shed 1 sizes first, keeping column B constant and changing the selected row. I filtered for IFNUMBER values only and collated returned values from each row into a smaller table and converted into a numerical value. From here I was able to create a formula that ignored 0 values and allowed the results from each row of the specified column to be combined into one list (column X below) which I could easily copy over into the new database, whilst also identifying any gaps in data retrieval. There were a small handful of sheds which did not return a shed size, and so the data for these were collected manually.

ROW 12

STEP 1   =INDIRECT("'"&B5&"'!b12")

STEP 2   =IF(C5>0,ISNUMBER(C5),"")

STEP 3   =IF(D5=TRUE,C5,"")

STEP 4   =NUMBERVALUE(STEP 3)

STEP 5 =IF(ROW10=0,IF(ROW14=0,IF(ROW13=0,IF(ROW12=0,"",ROW12),ROW13),ROW14),ROW10)

STEP 5 created a single list which was easily copied into the new database

 


 

CONCLUSION & FEEDBACK

 

By far the most difficult aspect of this project was the data collection, validation and organisation. This was due to the non-uniform nature of the data set, and the variance with each record.

 

Once this data had been collected, it was a relatively straightforward process to design the new calculator and link it to the newly built database via VLOOKUP, with the site names (vertical search queries) on the left-most column

 

For ease of use, conditional formatting and data validation were used extensively. The final calculator has only one input required of the end user - the site name.

 

Additional sites may be added to the database easily and conditional formatting was also used here to guide the user to input a complete set of data for the new entry

 

A brief training session was given to each user, however as the spreadsheet and all formulae are protected (excluding user input areas) I knew it was best to share the sheet with the users and allow them to become familiar with it

 

Certain cells are fully protected (headings, the whole calculator sheet excl. site name input). The database may be added to by select individuals, and the notes, contact, and address details may be updated by anyone.

 

Overall, the feedback received was that the new calculator was very intuitive, more aesthetically pleasing, and contained all requirements of the system.


Quality Checking Sheet

Operator Periodic Quality Check Form & Performance Record 

RATIO OF SHAVINGS: CHIP MIXTURE


DATA INPUT SHEET

Better UI for data entry - able to see a larger range of data for screen size

Conditional formatting with =today() which highlights todays date for easy data entry

Frozen top row for scrolling by week


QUALITY CHECK SHEET

Data entry fields with validation and drop down lists for specific entries

Originally planned to have buttons run scripts which would save this data to a different database sheet and store it there, along with a similar clear script which would clear the current form

Realised that buttons would not work in the iOS sheets app so created a custom menu drop down which could be used when running sheets in the browser in desktop mode

function onOpen() {

  var ui = SpreadsheetApp.getUi();

  // Or DocumentApp or FormApp.

  ui.createMenu('Willems Data')

      .addItem('Save', 'submitData')

      .addItem('Clear', 'clear1')

      .addToUi();

}


function submitData() {

  var ss        = SpreadsheetApp.getActiveSpreadsheet();

  var formSS    = ss.getSheetByName("Data Entry"); //Data entry Sheet

  var datasheet = ss.getSheetByName("Data"); //Data Sheet

  

  //Input Values

  var values = [[formSS.getRange("F6").getValue(),

                 formSS.getRange("F8").getValue(),

                 formSS.getRange("F10").getValue(),

                 formSS.getRange("F12").getValue(),

                 formSS.getRange("F14").getValue(),

                 formSS.getRange("F16").getValue(),

                 formSS.getRange("F18").getValue(),

                 formSS.getRange("F20").getValue(),

                 formSS.getRange("F22").getValue(),

                 formSS.getRange("F24").getValue(),

                 formSS.getRange("F26").getValue(),

                 formSS.getRange("F28").getValue(),

                 formSS.getRange("F30").getValue()]];

  

  datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 13).setValues(values);

 

}


function clear1() {

  var sheet = SpreadsheetApp.getActive().getSheetByName('Data Entry');

  var rangesToClear = ['F6', "F8", "F10", "F12", "F14", "F16","F18","F20","F22","F24","F26","F28","F30"];

  for (var i=0; i<rangesToClear.length; i++) { 

    sheet.getRange(rangesToClear[i]).clearContent();

    var getCar = sheet.getRange("D6").getValue();

    sheet.getRange("F6").setValue(getCar);

  }

}


function onEdit(e) {

  e.source.setActiveSelection(e.range.offset(2, 0));

}