[{"content":"Hello! I’m Anthony Arnold, a data enthusiast and a passionate problem solver based in Miami, FL.\nWith a Google Data Analysis Certificate and a strong skill set in Python, Tableau, SQL, and more, I am well-equipped to tackle complex data challenges. I have hands-on experience in data analysis projects, including a Florida COVID-19 Data Analysis Project, where I utilized spreadsheets, Tableau, and mathematical modeling techniques to extract valuable insights.\nI am excited about the possibilities that lie ahead in the field of data analysis. By leveraging my skills, I am committed to delivering data-driven solutions that drive meaningful outcomes.\nI would like to thank you for visiting my website. Feel free to explore my portfolio and reach out to me with any inquiries or collaboration opportunities. Let\u0026rsquo;s unlock the power of data together!\n","date":"2025-08-05T00:00:00Z","image":"https://arnoldant.github.io/blog/p/hello-world/cover_hu_bd7ae447bb7f5b43.jpg","permalink":"https://arnoldant.github.io/blog/p/hello-world/","title":"Hello World!"},{"content":"Hey everyone! 👋\nGame development has been a big part of my routine lately, but like many long creative projects, it sometimes helps to step back and adjust the plan.\nFor the past several months, I’ve been focused on Project Five, which has been my most ambitious game so far. As the project grew, I started realizing that while I’m excited about it, it’s also turning into something fairly large. Big projects are great learning experiences, but they also take a long time to finish, polish, and release.\nSo I decided to take a short break from Project Five and work on a much smaller game instead.\nThis isn’t abandoning the project—it’s more like a strategic detour. My goal with this smaller project is to create something simpler, tighter, and easier to ship. Finishing games is an important skill, and releasing something sooner helps keep motivation high while also providing valuable experience with the full development cycle.\nStill Showing Up Every Day\nEven though I’ve shifted focus to a smaller project, I’m still working on game development consistently. Lately my schedule has been getting busier, especially with job searching happening at the same time. Balancing those responsibilities with game development hasn’t always been easy, but I’ve been making an effort to keep showing up and making progress, even if it’s just a little each day.\nConsistency matters a lot more than huge bursts of productivity. Some days that means implementing a mechanic, other days it might mean debugging, learning something new, or even just planning the next steps.\nAs long as progress continues, the projects move forward.\nLearning Multiplayer Networking in Godot\nOne of the biggest technical areas I’ve been diving into recently is multiplayer networking. It’s something I’ve always wanted to learn, but it can definitely be one of the more complex parts of game development.\nUsing Godot’s multiplayer systems, I’ve been experimenting with:\nPeer connections\nServer authority and synchronization\nSpawning players across the network\nManaging game state between clients\nNetworking forces you to think about your code differently. Things that are simple in single-player—like spawning objects or updating player states—suddenly require careful synchronization between machines.\nIt’s been challenging, but also really rewarding to see it start working.\nA Fun Milestone\nOne of the coolest milestones recently was getting a multiplayer build running where all of my friends could join and play together. Seeing people connect to the game and interact in the same world was a huge moment for me.\nIt’s one thing to run multiplayer locally or with two test instances, but having a group of friends jump in and actually play the game together makes everything feel real. It’s also been incredibly helpful for testing, because multiplayer games reveal bugs and edge cases very quickly once more players get involved.\nMoments like that are a big reminder of why I enjoy building games in the first place.\nLooking Ahead\nFor now, the plan is simple:\nKeep making steady progress on the smaller project\nLearn more about multiplayer networking\nContinue balancing development with job searching\nEventually return to Project Five with more experience and momentum\nGame development is a long journey, and sometimes the best way forward is taking smaller steps that help you learn, finish things, and stay motivated along the way.\nI’m excited to see where this smaller project goes—and even more excited to eventually bring those lessons back into the larger one.\nMore updates soon.\n","date":"2026-03-04T00:00:00Z","image":"https://arnoldant.github.io/blog/p/game-devlog-03/04/2025/cover_hu_7895bacdb0c4de3d.jpg","permalink":"https://arnoldant.github.io/blog/p/game-devlog-03/04/2025/","title":"Game Devlog 03/04/2025"},{"content":"Hey everyone! Happy Holidays! 👋\nLately, I’ve been working nonstop on the game, and it finally feels like things are coming together in a real, tangible way. I’m getting close to having a proper proof of concept build, which is a huge milestone for this project.\nA lot of the recent work has been about tying systems together and polishing the feel of the game rather than just adding new mechanics. It’s less flashy work, but it’s the kind that really defines whether the game works or not.\nAs a small sneak peek, here’s the main menu I’ve been building. This is one of those pieces that sets the tone right away, so I spent a lot of time making sure it reflects the mood of the game and feels cohesive with the rest of the visuals.\nWhat makes this especially meaningful to me is that I created both the visuals and the music for this menu. On the audio side, this is actually my first time using FL Studio, so there was a pretty steep learning curve. That said, it’s been incredibly rewarding to see (and hear) everything come together, even if it’s still rough around the edges.\nOnce the proof of concept build is ready, I plan to have a group of friends and family playtest the game and give me honest, unfiltered feedback. I want to see how the game feels in fresh hands, what works, what doesn’t, and where it needs improvement. My goal is for this game to be something truly special, and that means being open to critique and refining it until it feels complete and intentional.\nThere’s still work to do, but I’m at the point where the game is starting to feel like a game, not just a collection of systems. The proof of concept build is almost here, and once that’s done, I’ll be able to share more concrete progress.\nComing soon is the new year, and I\u0026rsquo;m not one to believe in superstitions and common beliefs with its arrival, but this time I want to be different. Whenever I work on this game, I feel a sense of belonging. Not sure if anyone else has felt this, but a sense of \u0026ldquo;this is what I\u0026rsquo;m supposed to be.\u0026rdquo; Coming into 2026, I’m wishing for clarity, progress within this project, and growth throughout the many challenges in my life. Happy New Year!\nMore updates soon.\n","date":"2025-12-29T00:00:00Z","image":"https://arnoldant.github.io/blog/p/game-devlog-12/29/2025/cover_hu_4d788fc5d959b584.jpg","permalink":"https://arnoldant.github.io/blog/p/game-devlog-12/29/2025/","title":"Game Devlog 12/29/2025"},{"content":"In payroll accounting, some tasks just feel like they’re built to test your patience. Payroll Accounting Adjustments (PAAs) are definitely one of them. Month after month, they require the same copy-paste routines, manual matching, and formatting gymnastics. While I personally didn’t have much trouble completing them, I noticed something important: my coworkers did.\nEveryone had their own way of handling PAAs, and that inconsistency made the process slower, more error-prone, and incredibly frustrating for the team. Some people struggled with the volume of data, others with the formatting, and others with double-checking variances manually. Even with instructions, the sheer number of steps made it easy to miss something.\nSo I wondered: What if we didn’t have to do these steps manually at all? And that’s when I decided to automate the entire PAA workflow using VBA.\nBelow is the code I created to autoamte the allocation process. It was a challenging but worthwhile experience.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 Sub DeleteMonthlyTabs() Dim monthNames As Variant Dim ws As Worksheet Dim monthName As Variant Dim wsFound As Boolean \u0026#39; List of month names from June to May monthNames = Array(\u0026#34;June\u0026#34;, \u0026#34;July\u0026#34;, \u0026#34;August\u0026#34;, \u0026#34;September\u0026#34;, \u0026#34;October\u0026#34;, _ \u0026#34;November\u0026#34;, \u0026#34;December\u0026#34;, \u0026#34;January\u0026#34;, \u0026#34;February\u0026#34;, _ \u0026#34;March\u0026#34;, \u0026#34;April\u0026#34;, \u0026#34;May\u0026#34;) \u0026#39; Loop through each month name For Each monthName In monthNames On Error Resume Next \u0026#39; Attempt to set the worksheet object Set ws = ThisWorkbook.Sheets(monthName) On Error GoTo 0 \u0026#39; If the worksheet exists, delete it If Not ws Is Nothing Then Application.DisplayAlerts = False \u0026#39; Disable delete confirmation ws.Delete Application.DisplayAlerts = True \u0026#39; Re-enable delete confirmation Set ws = Nothing \u0026#39; Reset the worksheet object End If Next monthName End Sub Sub CombinedFromTo() \u0026#39; invoke previous sub first to clear already created sheets before generating DeleteMonthlyTabs RefreshData Dim selectedMonths As Collection Dim wsFactors As Worksheet, wsMonthlySplit As Worksheet, wsNew As Worksheet, wsToTest As Worksheet, wsCOA As Worksheet Dim tblSalaryDetail As ListObject, wdTable As ListObject Dim tblEmployeeComp As ListObject Dim row As ListRow Dim journalPeriod As String, journalPeriodTo As String Dim positionID As String Dim payComponent As String Dim valueToSum As Double Dim tiedKey As Variant Dim basePayTotal As Double, sickTotal As Double, vacationTotal As Double Dim holidayTotal As Double, floatingHolidayTotal As Double, adminLeaveTotal As Double Dim monthName As Variant Dim monthStart As Date, monthEnd As Date Dim tiedKeyRow As Long, payComponentRow As Long \u0026#39; Variables used for populating TO data Dim matchCol As Long Dim matchRow As Long Dim toTestRow As Long Dim percentageValue As Variant Dim cumulativeTotal As Double \u0026#39; Variables used for tracking Annual Pay changes Dim rng As Range Dim effectiveDate As Date Dim lastValue As Variant Dim changeCount As Integer Dim dateChanges() As Date Dim idx As Integer Dim basePayProposedArr() As Double Dim mostRecentEffectiveDateBeforeJune As Date Dim mostRecentBasePayProposedBeforeJune As Double Dim lastEntryFoundBeforeJune As Boolean \u0026#39;Capture today\u0026#39;s date and the fiscal year Dim tdDate As Date Dim fYear As Long tdDate = Date Debug.Print (tdDate) If tdDate \u0026gt; \u0026#34;5/31/\u0026#34; \u0026amp; Year(tdDate) Then fYear = Year(tdDate) + 1 Else fYear = Year(tdDate) End If \u0026#39; Grab projections input from this sheet Set wsToTest = ThisWorkbook.Worksheets(\u0026#34;PS_Copy\u0026#34;) \u0026#39; COA: Grab COA sheet Set wsCOA = ThisWorkbook.Worksheets(\u0026#34;Master\u0026#34;) \u0026#39; Initialize collection for selected months Set selectedMonths = New Collection \u0026#39; Show the custom user form to select months and retrieve positionID UserForm_MonthSelector.Show \u0026#39; Get the Position ID value from the TextBox on the UserForm positionID = wsToTest.Range(\u0026#34;H8\u0026#34;).Value \u0026#39; UserForm_MonthSelector.tb_PosID.Value If positionID = \u0026#34;\u0026#34; Then MsgBox \u0026#34;No Position ID provided. Macro will now exit.\u0026#34;, vbExclamation, \u0026#34;Missing Input\u0026#34; Exit Sub End If \u0026#39; Add selected months to the collection based on the checkboxes in the UserForm - generate in FY order If UserForm_MonthSelector.cb_June.Value Then selectedMonths.Add \u0026#34;June\u0026#34; If UserForm_MonthSelector.cb_July.Value Then selectedMonths.Add \u0026#34;July\u0026#34; If UserForm_MonthSelector.cb_August.Value Then selectedMonths.Add \u0026#34;August\u0026#34; If UserForm_MonthSelector.cb_September.Value Then selectedMonths.Add \u0026#34;September\u0026#34; If UserForm_MonthSelector.cb_October.Value Then selectedMonths.Add \u0026#34;October\u0026#34; If UserForm_MonthSelector.cb_November.Value Then selectedMonths.Add \u0026#34;November\u0026#34; If UserForm_MonthSelector.cb_December.Value Then selectedMonths.Add \u0026#34;December\u0026#34; If UserForm_MonthSelector.cb_January.Value Then selectedMonths.Add \u0026#34;January\u0026#34; If UserForm_MonthSelector.cb_February.Value Then selectedMonths.Add \u0026#34;February\u0026#34; If UserForm_MonthSelector.cb_March.Value Then selectedMonths.Add \u0026#34;March\u0026#34; If UserForm_MonthSelector.cb_April.Value Then selectedMonths.Add \u0026#34;April\u0026#34; If UserForm_MonthSelector.cb_May.Value Then selectedMonths.Add \u0026#34;May\u0026#34; \u0026#39; Check if at least one month is selected If selectedMonths.Count = 0 Then MsgBox \u0026#34;No months were selected. Macro will now exit.\u0026#34;, vbExclamation, \u0026#34;No Selection\u0026#34; Exit Sub End If \u0026#39; Reference the \u0026#34;Monthly_Split\u0026#34; tab On Error Resume Next Set wsMonthlySplit = ThisWorkbook.Sheets(CStr(UserForm_MonthSelector.tb_wp.Value) \u0026amp; \u0026#34;_Split\u0026#34;) On Error GoTo 0 If wsMonthlySplit Is Nothing Then MsgBox \u0026#34;Sheet \u0026#39;Monthly_Split\u0026#39; does not exist in this workbook.\u0026#34;, vbCritical, \u0026#34;Error\u0026#34; Exit Sub End If \u0026#39; Reference the \u0026#34;Factors\u0026#34; tab On Error Resume Next Set wsFactors = ThisWorkbook.Sheets(\u0026#34;Factors\u0026#34;) On Error GoTo 0 If wsFactors Is Nothing Then MsgBox \u0026#34;The \u0026#39;Factors\u0026#39; tab could not be found.\u0026#34;, vbCritical, \u0026#34;Error\u0026#34; Exit Sub End If \u0026#39; Reference the WD_SALARYDETAIL table on the Factors sheet On Error Resume Next Set wdTable = wsFactors.ListObjects(\u0026#34;WD_SALARYDETAIL\u0026#34;) On Error GoTo 0 If wdTable Is Nothing Then MsgBox \u0026#34;The \u0026#39;WD_SALARYDETAIL\u0026#39; table could not be found on the \u0026#39;Factors\u0026#39; sheet.\u0026#34;, vbCritical, \u0026#34;Error\u0026#34; Exit Sub End If \u0026#39; Reference the Employee_Comp table on the AnnualPay sheet On Error Resume Next Set tblEmployeeComp = ThisWorkbook.Sheets(\u0026#34;AnnualPay\u0026#34;).ListObjects(\u0026#34;Employee_Comp\u0026#34;) On Error GoTo 0 If tblEmployeeComp Is Nothing Then MsgBox \u0026#34;The \u0026#39;Employee_Comp\u0026#39; table could not be found on the \u0026#39;AnnualPay\u0026#39; sheet.\u0026#34;, vbCritical, \u0026#34;Error\u0026#34; Exit Sub End If \u0026#39; Retrieve EmployeeID, EmployeeName, Pay Effective Date, and BasePayProposed using the Position ID Dim colPosID As Long, colWorker As Long, colPayEffDate As Long, colBasePayProposed As Long, EmployeeID As String, EmployeeName As String, BasePayProposed As Double colPosID = tblEmployeeComp.ListColumns(\u0026#34;PosID\u0026#34;).Index colWorker = tblEmployeeComp.ListColumns(\u0026#34;Worker\u0026#34;).Index colPayEffDate = tblEmployeeComp.ListColumns(\u0026#34;Effective Date\u0026#34;).Index colBasePayProposed = tblEmployeeComp.ListColumns(\u0026#34;Base Pay - Proposed\u0026#34;).Index \u0026#39; What to do if error when getting information. On Error Resume Next Dim FoundRow As ListRow Set FoundRow = tblEmployeeComp.ListRows(WorksheetFunction.Match(positionID, tblEmployeeComp.ListColumns(colPosID).DataBodyRange, 0)) On Error GoTo 0 If FoundRow Is Nothing Then MsgBox \u0026#34;The Position ID was not found in the Employee_Comp table.\u0026#34;, vbExclamation, \u0026#34;Error\u0026#34; Exit Sub Else EmployeeID = FoundRow.Range.Cells(1, tblEmployeeComp.ListColumns(\u0026#34;Employee ID\u0026#34;).Index).Value EmployeeName = FoundRow.Range.Cells(1, colWorker).Value End If \u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39; \u0026#39; tracking annual pay changes \u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39; \u0026#39; Find matching rows for Position ID Dim posColumn As Range, effDateColumn As Range, basePayCurrentCol As Range, basePayProposedCol As Range Set posColumn = tblEmployeeComp.ListColumns(\u0026#34;PosID\u0026#34;).DataBodyRange Set effDateColumn = tblEmployeeComp.ListColumns(\u0026#34;Effective Date\u0026#34;).DataBodyRange Set basePayProposedCol = tblEmployeeComp.ListColumns(\u0026#34;Base Pay - Proposed\u0026#34;).DataBodyRange changeCount = 0 lastValue = \u0026#34;\u0026#34; idx = 0 lastEntryFoundBeforeJune = False \u0026#39; Loop through rows For Each rng In posColumn If CStr(rng.Value) = CStr(positionID) Then effectiveDate = rng.Offset(0, effDateColumn.Column - posColumn.Column).Value \u0026#39; Capture most recent effective date before June 1, 2025 [FY HARDCODED] \u0026#39; adjust so that an entry isn\u0026#39;t missed like for P00005148 if effective date is right on 6/1/2025 \u0026#39; If effectiveDate \u0026lt; DateSerial(2025, 6, 1) Then If effectiveDate \u0026lt;= DateSerial(fYear - 1, 6, 1) Then If Not lastEntryFoundBeforeJune Or effectiveDate \u0026gt; mostRecentEffectiveDateBeforeJune Then mostRecentEffectiveDateBeforeJune = effectiveDate mostRecentBasePayProposedBeforeJune = rng.Offset(0, basePayProposedCol.Column - posColumn.Column).Value lastEntryFoundBeforeJune = True End If End If \u0026#39; Track changes in effective date and only store values for current FY [FY HARDCODED] If effectiveDate \u0026gt; DateSerial(fYear - 1, 5, 31) And effectiveDate \u0026lt;\u0026gt; lastValue Then changeCount = changeCount + 1 lastValue = effectiveDate \u0026#39; Store date change ReDim Preserve dateChanges(idx) dateChanges(idx) = effectiveDate \u0026#39; Store corresponding pay values ReDim Preserve basePayProposedArr(idx) basePayProposedArr(idx) = rng.Offset(0, basePayProposedCol.Column - posColumn.Column).Value idx = idx + 1 End If End If Next rng \u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39; \u0026#39; initial values Dim z: z = UBound(dateChanges) - LBound(dateChanges) \u0026#39;start with most dated values in arrays BasePayProposed = mostRecentBasePayProposedBeforeJune \u0026#39;starting salary before comencement of FY [outside of array] \u0026#39; [HARDCODED] Change for next fiscal year. \u0026#39; Process each selected month For Each monthName In selectedMonths \u0026#39; Define month start and end dates Select Case monthName Case \u0026#34;June\u0026#34; monthStart = DateSerial(fYear - 1, 6, 1) monthEnd = DateSerial(fYear - 1, 6, 30) Case \u0026#34;July\u0026#34; monthStart = DateSerial(fYear - 1, 7, 1) monthEnd = DateSerial(fYear - 1, 7, 31) Case \u0026#34;August\u0026#34; monthStart = DateSerial(fYear - 1, 8, 1) monthEnd = DateSerial(fYear - 1, 8, 31) Case \u0026#34;September\u0026#34; monthStart = DateSerial(fYear - 1, 9, 1) monthEnd = DateSerial(fYear - 1, 9, 30) Case \u0026#34;October\u0026#34; monthStart = DateSerial(fYear - 1, 10, 1) monthEnd = DateSerial(fYear - 1, 10, 31) Case \u0026#34;November\u0026#34; monthStart = DateSerial(fYear - 1, 11, 1) monthEnd = DateSerial(fYear - 1, 11, 30) Case \u0026#34;December\u0026#34; monthStart = DateSerial(fYear - 1, 12, 1) monthEnd = DateSerial(fYear - 1, 12, 31) Case \u0026#34;January\u0026#34; monthStart = DateSerial(fYear, 1, 1) monthEnd = DateSerial(fYear, 1, 31) Case \u0026#34;February\u0026#34; monthStart = DateSerial(fYear, 2, 1) monthEnd = DateSerial(fYear, 2, 28) Case \u0026#34;March\u0026#34; monthStart = DateSerial(fYear, 3, 1) monthEnd = DateSerial(fYear, 3, 31) Case \u0026#34;April\u0026#34; monthStart = DateSerial(fYear, 4, 1) monthEnd = DateSerial(fYear, 4, 30) Case \u0026#34;May\u0026#34; monthStart = DateSerial(fYear, 5, 1) monthEnd = DateSerial(fYear, 5, 31) End Select \u0026#39; Duplicate the \u0026#34;Monthly_Split\u0026#34; tab and rename it wsMonthlySplit.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) Set wsNew = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) wsNew.Name = monthName wsNew.Tab.Color = RGB(144, 238, 144) \u0026#39; Place start and end dates into cells G9 and H9 With wsNew .Range(\u0026#34;G9\u0026#34;).Value = monthStart .Range(\u0026#34;H9\u0026#34;).Value = monthEnd \u0026#39; Populate EmployeeID, EmployeeName, and BasePayProposed into respective cells .Range(\u0026#34;H1\u0026#34;).Value = EmployeeID .Range(\u0026#34;H2\u0026#34;).Value = EmployeeName \u0026#39; fixed below so that it is based on the Salary during that (monthly) period in FY25 instead of grabbing most recent If monthStart = dateChanges(z) Then BasePayProposed = basePayProposedArr(z) If z \u0026gt; 0 Then z = z - 1 \u0026#39;only decrement to the most recent entry if within array bounds End If End If .Range(\u0026#34;H5\u0026#34;).Value = BasePayProposed End With \u0026#39; Initialize starting rows tiedKeyRow = 18 payComponentRow = 19 \u0026#39; Reset totals basePayTotal = 0 sickTotal = 0 vacationTotal = 0 holidayTotal = 0 floatingHolidayTotal = 0 adminLeaveTotal = 0 \u0026#39; Fixed row loop so that the same Worktag is not repeated and corressponding components are properly grouped and summed Dim processedTiedKeys As Collection Set processedTiedKeys = New Collection \u0026#39; To track already processed tied keys For Each row In wdTable.ListRows If row.Range(1, wdTable.ListColumns(\u0026#34;Journal Line Position ID\u0026#34;).Index).Value = positionID And _ row.Range(1, wdTable.ListColumns(\u0026#34;Journal Source\u0026#34;).Index).Value = \u0026#34;Payroll Actual Accrual\u0026#34; Then journalPeriod = row.Range(1, wdTable.ListColumns(\u0026#34;Journal Period\u0026#34;).Index).Value \u0026#39; Get Journal Period \u0026#39; Process only rows matching the current month If journalPeriod = Left(monthName, 3) Then payComponent = row.Range(1, wdTable.ListColumns(\u0026#34;Pay Component\u0026#34;).Index).Value \u0026#39; Get Pay Component valueToSum = row.Range(1, wdTable.ListColumns(\u0026#34;Transaction Amount\u0026#34;).Index).Value \u0026#39; Get the value for the row \u0026#39; Capture the tied key (Program, Grant, or Gift) If row.Range(1, wdTable.ListColumns(\u0026#34;Program\u0026#34;).Index).Value \u0026lt;\u0026gt; \u0026#34;\u0026#34; Then tiedKey = Split(row.Range(1, wdTable.ListColumns(\u0026#34;Program\u0026#34;).Index).Value, \u0026#34; \u0026#34;)(0) ElseIf row.Range(1, wdTable.ListColumns(\u0026#34;Grant\u0026#34;).Index).Value \u0026lt;\u0026gt; \u0026#34;\u0026#34; Then tiedKey = Split(row.Range(1, wdTable.ListColumns(\u0026#34;Grant\u0026#34;).Index).Value, \u0026#34; \u0026#34;)(0) ElseIf row.Range(1, wdTable.ListColumns(\u0026#34;Gift\u0026#34;).Index).Value \u0026lt;\u0026gt; \u0026#34;\u0026#34; Then tiedKey = Split(row.Range(1, wdTable.ListColumns(\u0026#34;Gift\u0026#34;).Index).Value, \u0026#34; \u0026#34;)(0) Else tiedKey = \u0026#34;Undefined\u0026#34; End If \u0026#39; Check if the tied key has already been processed Dim keyExists As Boolean keyExists = False On Error Resume Next keyExists = Not IsError(processedTiedKeys(tiedKey)) On Error GoTo 0 If Not keyExists Then \u0026#39; Add the tied key to the collection to mark it as processed processedTiedKeys.Add tiedKey, tiedKey \u0026#39; Initialize totals for this tied key basePayTotal = 0 sickTotal = 0 vacationTotal = 0 holidayTotal = 0 floatingHolidayTotal = 0 adminLeaveTotal = 0 \u0026#39; Nested loop to process all rows corresponding to this tied key For Each subRow In wdTable.ListRows If subRow.Range(1, wdTable.ListColumns(\u0026#34;Journal Line Position ID\u0026#34;).Index).Value = positionID And _ subRow.Range(1, wdTable.ListColumns(\u0026#34;Journal Source\u0026#34;).Index).Value = \u0026#34;Payroll Actual Accrual\u0026#34; And _ ((subRow.Range(1, wdTable.ListColumns(\u0026#34;Program\u0026#34;).Index).Value Like tiedKey \u0026amp; \u0026#34;*\u0026#34;) Or _ (subRow.Range(1, wdTable.ListColumns(\u0026#34;Grant\u0026#34;).Index).Value Like tiedKey \u0026amp; \u0026#34;*\u0026#34;) Or _ (subRow.Range(1, wdTable.ListColumns(\u0026#34;Gift\u0026#34;).Index).Value Like tiedKey \u0026amp; \u0026#34;*\u0026#34;)) Then subJournalPeriod = subRow.Range(1, wdTable.ListColumns(\u0026#34;Journal Period\u0026#34;).Index).Value \u0026#39; Get Journal Period \u0026#39; Process only rows matching the current month If subJournalPeriod = Left(monthName, 3) Then subPayComponent = subRow.Range(1, wdTable.ListColumns(\u0026#34;Pay Component\u0026#34;).Index).Value \u0026#39; Get Pay Component subValueToSum = subRow.Range(1, wdTable.ListColumns(\u0026#34;Transaction Amount\u0026#34;).Index).Value \u0026#39; Get the value for the row \u0026#39; Add value to the appropriate total \u0026#39; TODO: Bring in remaining components and add to the appropriate category below Select Case subPayComponent Case \u0026#34;Admin Leave\u0026#34; adminLeaveTotal = adminLeaveTotal + subValueToSum \u0026#39; TODO: modify PQ to filter Activity Pay by SC (**since not all AP\u0026#39;s go to Base**) Case \u0026#34;Activity Pay (Not Reported)\u0026#34;, \u0026#34;Activity Pay (Reported)\u0026#34;, \u0026#34;Base- ACP\u0026#34;, \u0026#34;Base Pay\u0026#34;, \u0026#34;Disaster Double Time Pay\u0026#34;, \u0026#34;Disaster Pay\u0026#34;, \u0026#34;Education\u0026#34;, \u0026#34;FWS- Academic Year\u0026#34;, \u0026#34;FWS- Overflow (Summer-1)\u0026#34;, \u0026#34;FWS- Summer1\u0026#34;, \u0026#34;FWS- Summer2\u0026#34;, \u0026#34;Parental Leave\u0026#34;, \u0026#34;Regular\u0026#34;, \u0026#34;Retro (Hourly)\u0026#34;, \u0026#34;Sea Pay\u0026#34;, \u0026#34;Severance (onetime)\u0026#34;, \u0026#34;Shift Diff 10%\u0026#34;, \u0026#34;Shift Diff 6%\u0026#34;, \u0026#34;Student Onetime Pay\u0026#34; If subPayComponent = \u0026#34;Activity Pay (Not Reported)\u0026#34; Then basePayTotal = basePayTotal Else basePayTotal = basePayTotal + subValueToSum End If Case \u0026#34;Floating Holiday\u0026#34; floatingHolidayTotal = floatingHolidayTotal + subValueToSum Case \u0026#34;Holiday (Exempt)\u0026#34; holidayTotal = holidayTotal + subValueToSum Case \u0026#34;Sick / EIB Pay\u0026#34; sickTotal = sickTotal + subValueToSum Case \u0026#34;Vacation / PTO\u0026#34;, \u0026#34;Vacation / PTO Payout\u0026#34; vacationTotal = vacationTotal + subValueToSum End Select End If End If Next subRow \u0026#39; Write tiedKey and component totals to the sheet after processing all rows for this tiedKey wsNew.Cells(tiedKeyRow, \u0026#34;B\u0026#34;).Value = tiedKey \u0026#39; Tied Key wsNew.Cells(payComponentRow, \u0026#34;C\u0026#34;).Value = basePayTotal \u0026#39; Base Pay Total wsNew.Cells(payComponentRow + 1, \u0026#34;C\u0026#34;).Value = sickTotal \u0026#39; Sick Pay Total wsNew.Cells(payComponentRow + 2, \u0026#34;C\u0026#34;).Value = vacationTotal \u0026#39; Vacation Pay Total wsNew.Cells(payComponentRow + 3, \u0026#34;C\u0026#34;).Value = holidayTotal \u0026#39; Holiday Pay Total wsNew.Cells(payComponentRow + 4, \u0026#34;C\u0026#34;).Value = floatingHolidayTotal \u0026#39; Floating Holiday Pay Total wsNew.Cells(payComponentRow + 5, \u0026#34;C\u0026#34;).Value = adminLeaveTotal \u0026#39; Admin Leave Pay Total \u0026#39; Increment tiedKeyRow and payComponentRow for the next entry (row offset of 7) tiedKeyRow = tiedKeyRow + 7 payComponentRow = payComponentRow + 7 End If End If End If Next row \u0026#39; insert logic for TO DRIVER \u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39; \u0026#39; need a secondary journalPeriod(To) variable to prevent interference with primary var \u0026#39; reset journalPeriod with next monthName as monthly loop progresses Select Case monthName Case \u0026#34;January\u0026#34;: journalPeriodTo = \u0026#34;Jan %\u0026#34; Case \u0026#34;February\u0026#34;: journalPeriodTo = \u0026#34;Feb %\u0026#34; Case \u0026#34;March\u0026#34;: journalPeriodTo = \u0026#34;Mar %\u0026#34; Case \u0026#34;April\u0026#34;: journalPeriodTo = \u0026#34;Apr %\u0026#34; Case \u0026#34;May\u0026#34;: journalPeriodTo = \u0026#34;May %\u0026#34; Case \u0026#34;June\u0026#34;: journalPeriodTo = \u0026#34;Jun %\u0026#34; Case \u0026#34;July\u0026#34;: journalPeriodTo = \u0026#34;Jul %\u0026#34; Case \u0026#34;August\u0026#34;: journalPeriodTo = \u0026#34;Aug %\u0026#34; Case \u0026#34;September\u0026#34;: journalPeriodTo = \u0026#34;Sep %\u0026#34; Case \u0026#34;October\u0026#34;: journalPeriodTo = \u0026#34;Oct %\u0026#34; Case \u0026#34;November\u0026#34;: journalPeriodTo = \u0026#34;Nov %\u0026#34; Case \u0026#34;December\u0026#34;: journalPeriodTo = \u0026#34;Dec %\u0026#34; Case Else: journalPeriodTo = \u0026#34;S-May\u0026#34; End Select \u0026#39; Display the entered Journal Period for verification \u0026#39; wsNew.Range(\u0026#34;M32\u0026#34;).Value = journalPeriodTo \u0026#39; View Journal Period used \u0026#39; Find matching column for the month in \u0026#34;Test_PS\u0026#34; row 11 On Error Resume Next matchCol = wsToTest.Rows(18).Find(What:=journalPeriodTo, LookIn:=xlValues, LookAt:=xlWhole).Column On Error GoTo 0 \u0026#39; Reset error handling after search If matchCol = 0 Then MsgBox \u0026#34;No matching month found in row 11 of \u0026#39;PS_Copy\u0026#39; tab.\u0026#34;, vbCritical Exit Sub End If \u0026#39; Start searching for a match only in rows greater than row 12 On Error Resume Next matchRow = wsToTest.Columns(matchCol).Find(What:=\u0026#34;%\u0026#34;, After:=wsToTest.Cells(18, matchCol), LookIn:=xlValues, LookAt:=xlPart).row On Error GoTo 0 \u0026#39; Reset error handling after search If matchRow = 0 Or matchRow \u0026lt;= 18 Then MsgBox \u0026#34;No matching percentage value found below row 12 in column for the month on \u0026#39;PS_Copy\u0026#39; tab.\u0026#34;, vbCritical Exit Sub End If \u0026#39; **Fix for Error 1004: Ensure matchRow and matchCol are within valid range** If matchRow \u0026gt; wsToTest.Rows.Count Or matchCol \u0026gt; wsToTest.Columns.Count Then MsgBox \u0026#34;Invalid row or column detected. Macro will exit.\u0026#34;, vbCritical Exit Sub End If \u0026#39; Retrieve percentage value safely On Error Resume Next percentageValue = wsToTest.Cells(matchRow, matchCol).Value On Error GoTo 0 \u0026#39; Reset error handling \u0026#39; Fill B25 (B18) or the next available blank cell with the value from Column B safely If matchRow \u0026gt; 0 Then Dim targetCell, targetCell2 As Range Set targetCell = wsNew.Range(\u0026#34;B18\u0026#34;) Set targetCell2 = wsNew.Range(\u0026#34;G18\u0026#34;) toTestRow = 25 \u0026#39;offset by 7 for the 2nd To worktag entry after the initial one is detected to be used in the Do While cumulativeTotal \u0026lt; 1 loop below Dim searchValue As String searchValue = Trim(wsToTest.Cells(matchRow, 7).Value) searchValue = FindCOAValue(searchValue) Debug.Print searchValue \u0026amp; \u0026#34;---\u0026#34; \u0026#39; Loop until a blank cell is found Do While targetCell.Value \u0026lt;\u0026gt; \u0026#34;\u0026#34; If targetCell.Value = searchValue Then Exit Do End If \u0026#39;Debug.Print targetCell.Value \u0026#39;Debug.Print wsToTest.Cells(matchRow, 7).Value Set targetCell = targetCell.Offset(7, 0) \u0026#39; Move down by 7 rows Set targetCell2 = targetCell2.Offset(7, 0) \u0026#39; Move down by 7 rows toTestRow = toTestRow + 7 Loop \u0026#39; Write the value to the first available blank cell targetCell.Value = searchValue \u0026#39; Ensure percentageValue is valid If IsNumeric(percentageValue) And Not IsEmpty(percentageValue) Then percentageValue = CDbl(percentageValue) targetCell2.Value = percentageValue Else percentageValue = 0 End If End If \u0026#39; If percentage is less than 1, continue filling values conditionally If percentageValue \u0026lt; 1 Then cumulativeTotal = percentageValue Do While cumulativeTotal \u0026lt; 1 Or (journalPeriodTo = \u0026#34;S-May\u0026#34; And cumulativeTotal \u0026lt; 2) matchRow = matchRow + 1 \u0026#39; Move to the succeeding row in \u0026#39;Test_PS\u0026#39; \u0026#39; **Ensure matchRow doesn\u0026#39;t exceed worksheet limits** If matchRow \u0026gt; wsToTest.Rows.Count Then MsgBox \u0026#34;Reached end of data in \u0026#39;PS_Copy\u0026#39;. Macro will exit.\u0026#34;, vbCritical Exit Sub End If On Error Resume Next percentageValue = wsToTest.Cells(matchRow, matchCol).Value On Error GoTo 0 \u0026#39; Reset error handling \u0026#39; Ensure percentage value is valid \u0026#39; **************** [HARDCODED] UPDATE \u0026#39;2026\u0026#39; VALUE FOR NEW FISCAL YEAR ************************************ If IsNumeric(percentageValue) And Not IsEmpty(percentageValue) And percentageValue \u0026lt;\u0026gt; 0 And wsToTest.Cells(matchRow, 13).Value = fYear Then percentageValue = CDbl(percentageValue) cumulativeTotal = cumulativeTotal + percentageValue \u0026#39; Fill values in the \u0026#34;Test\u0026#34; tab Dim scanDriverLoc As Long scanDriverLoc = 18 searchValue = Trim(wsToTest.Cells(matchRow, 7).Value) searchValue = FindCOAValue(searchValue) Do While scanDriverLoc \u0026lt;\u0026gt; toTestRow If wsNew.Cells(scanDriverLoc, \u0026#34;B\u0026#34;).Value = wsToTest.Cells(matchRow, 7).Value Then Debug.Print matchRow Debug.Print wsToTest.Cells(matchRow, 7).Value Debug.Print wsNew.Cells(scanDriverLoc, \u0026#34;B\u0026#34;).Value Exit Do End If scanDriverLoc = scanDriverLoc + 7 Loop wsNew.Cells(scanDriverLoc, \u0026#34;G\u0026#34;).Value = percentageValue \u0026#39; Next percentage value If matchRow \u0026gt; 0 And scanDriverLoc = toTestRow Then wsNew.Cells(toTestRow, \u0026#34;B\u0026#34;).Value = wsToTest.Cells(matchRow, 7).Value \u0026#39; Column B reference End If \u0026#39; Increment toTestRow only if percentageValue is valid toTestRow = toTestRow + 7 End If Loop End If \u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39;\u0026#39; Next monthName \u0026#39; Inform the user MsgBox \u0026#34;Sheets created.\u0026#34;, vbInformation, \u0026#34;Success\u0026#34; End Sub Function FindCOAValue(searchValue As String) As Variant Dim ws As Worksheet Dim lastrow As Long Dim rng As Range, cell As Range Dim matches As Collection Dim candidateValue As String Set ws = ThisWorkbook.Worksheets(\u0026#34;Master\u0026#34;) lastrow = ws.Cells(ws.Rows.Count, \u0026#34;A\u0026#34;).End(xlUp).row Set matches = New Collection Set rng = ws.Range(\u0026#34;A1:A\u0026#34; \u0026amp; lastrow) For Each cell In rng If Trim(cell.Value) = searchValue Then matches.Add cell.row Debug.Print (ws.Cells(cell.row, \u0026#34;B\u0026#34;)) End If Next cell If matches.Count = 1 Then FindCOAValue = ws.Cells(matches(1), \u0026#34;B\u0026#34;) Exit Function End If If matches.Count \u0026gt; 1 Then candidateValue = searchValue \u0026amp; \u0026#34;-3\u0026#34; For Each r In matches If ws.Cells(r, \u0026#34;B\u0026#34;).Value = candidateValue Then FindCOAValue = ws.Cells(r, \u0026#34;B\u0026#34;).Value Exit Function End If Next r FindCOAValue = ws.Cells(matches(1), \u0026#34;B\u0026#34;).Value End If End Function Sub RefreshData() ThisWorkbook.RefreshAll MsgBox \u0026#34;Data has been refreshed successfully.\u0026#34; End Sub ","date":"2025-12-02T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/automating-financial-processes-in-excel/","title":"Automating Financial Processes in Excel"},{"content":"Hey everyone! 👋\nIt’s been a little while since my last post, but don’t worry! I’ve still been working on Project Five every single day. I decided to focus more on actually making the game and recording gameplay footage rather than editing and posting updates. That said, there’s been a ton of progress behind the scenes that I can’t wait to start sharing again.\nToday, I’m excited to show a new combat preview that highlights where the game’s roguelike mechanics truly start to shine. Each ring you equip now comes with a random buff, adding a whole new layer of depth and replayability to the gameplay.\nHere are some examples of what you can expect:\n🔥 Damage buffs for specific elements ⚡ Reload speed reductions for faster attacks 🦾 Augment buffs that directly enhance the hand — reserved only for legendary rings\nLegendary rings drop with their unique, fixed augment buff, while common buffs can stack, making your character incredibly powerful with the right combinations.\nAlongside the combat overhaul, I’ve also updated the HUD, refined enemy behavior, and made improvements to the background visuals to give the world more atmosphere and depth.\nThere’s still so much more I want to share — but for now, check out the new combat video! I hope you enjoy the video and stay tuned for more updates.\n#IndieDev #GameDev #PixelArt #Devlog #PoisonAbilities #DanceMinigame\n","date":"2025-10-22T00:00:00Z","image":"https://arnoldant.github.io/blog/p/game-devlog-10/22/2025/cover_hu_5e2f6ce2cbaec5e2.jpg","permalink":"https://arnoldant.github.io/blog/p/game-devlog-10/22/2025/","title":"Game Devlog 10/22/2025"},{"content":"This week’s update brings some exciting new systems and enemy tweaks to the game.\n🟢 Slime Improvements\nSlimes now hop with varied timers for more natural movement\nCleaner, more efficient code and updated animations\nParticle effects make them feel livelier than ever\n☠️ Poison Abilities\nAdded a poison grenade and a ticking poison effect\nSpewer enemies are immune, adding a layer of strategy\n🤸‍♂️ Player Tumble Animation\nNew mid-air tumble animation decreases hitbox size, perfect for dodging attacks 💃 Dance Room Expansion\nAmbient lighting, new scenery, and dancing characters\nA nod to some beloved cats, bringing a fun, lighthearted change of pace\nWhat’s next? More ring abilities and environmental variety are on the way!\n#IndieDev #GameDev #PixelArt #Devlog #PoisonAbilities #DanceMinigame\n","date":"2025-09-12T00:00:00Z","image":"https://arnoldant.github.io/blog/p/game-devlog-9/12/2025/cover_hu_85ec9ce706481444.jpg","permalink":"https://arnoldant.github.io/blog/p/game-devlog-9/12/2025/","title":"Game Devlog 9/12/2025"},{"content":"I’ve been working with Tableau for a while, but recently I decided it was time to dive into Power BI. To get some hands-on practice, I chose a sample sales dataset and set out to build a dashboard that could highlight trends in products, territories, and revenue. What started as an experiment quickly turned into a fun project with some solid insights.\nThe Dataset For this project, I used the AdventureWorks sample sales database. It contains information about products, territories, subcategories, and sales over time.\nBefore building the visuals, I had to do a little data prep:\nConverted month numbers into month names (so January, February, etc. instead of 1, 2, 3).\nChanged fields like sales amount into a proper currency format.\nMade sure territories like Southwest, Central, Northeast were mapped correctly.\nThis step made the visuals more intuitive and ready for analysis.\nBuilding the Dashboard I started by creating a few queries in Power BI’s Power Query Editor:\nMost sold product → which bike had the highest sales volume.\nLeast sold product → which product underperformed.\nSubcategory breakdown → total units sold by bike type (mountain, road, touring, etc.).\nSales by territory → performance across regions like the United States, Canada, UK, France, and more.\nFrom there, I built out the visuals:\nA bar chart showing monthly sales trends.\nCard visuals highlighting the best and worst sellers.\nA pie chart to illustrate the sales split by bike subcategory.\nA map visual to show sales by territory.\nAlong the way, I learned how to:\nSort months properly using “Sort by Column.”\nAdd filters (slicers) so I could view results by year.\nClean up the design by removing chart backgrounds and adding a company logo.\nKey Insights A few interesting things stood out:\nSome bike subcategories were clear winners, dominating total units sold.\nThe U.S. territories (Central, Southwest, Northeast, etc.) made up the bulk of sales, but there was meaningful activity in Canada and Europe as well.\nThe monthly breakdown showed predictable peaks and dips, which could be useful for future forecasting.\nDesign Choices I wanted the dashboard to feel clean and modern, so I:\nRemoved unnecessary borders and backgrounds.\nUsed cards for quick KPIs (best seller, worst seller).\nPlaced the logo in the corner to give it a branded look.\nArranged visuals logically: trends on the left, categories and maps on the right.\nWhat I Learned This project helped me:\nGet comfortable with Power BI’s query editor.\nPractice using filters and slicers to add interactivity.\nThink about dashboard design in terms of both analysis and presentation.\nCompared to Tableau, Power BI felt more integrated with Microsoft tools and had a smoother workflow for data prep. Tableau still feels stronger for quick visual design, but Power BI shines when it comes to reporting and sharing in a business environment.\nNext Steps If I were to expand this project, I’d like to:\nAdd more KPIs (like revenue by customer segment).\nBuild a forecasting model to predict future sales.\nTry embedding the interactive dashboard into my website instead of just sharing images.\nConclusion This was my first end-to-end project in Power BI, and I’m really happy with how it turned out. It’s one thing to follow tutorials, but working with an actual dataset and creating visuals from scratch is the best way to learn.\nIf you’re just starting with Power BI, I highly recommend picking a dataset that interests you and giving it a try!\nSQL code used:\nSELECT TOP 1 People.FirstName, People.LastName, SalesTeam.SalesYTD FROM Sales.SalesPerson SalesTeam JOIN Person.Person People ON People.BusinessEntityID = SalesTeam.BusinessEntityID ORDER BY SalesTeam.SalesYTD DESC SELECT Year(OrderDate) SaleYear, MONTH(OrderDate) SaleMonth, SUM(TotalDue) TotalSales FROM Sales.SalesOrderHeader Header GROUP BY Year(OrderDate), MONTH(OrderDate) SELECT ProductTable.Name ProductName, OrderTable.ProductID, SUM(OrderQty) TotalUnitsSold FROM Sales.SalesOrderDetail OrderTable JOIN Production.Product ProductTable ON ProductTable.ProductID = OrderTable.ProductID JOIN Production.ProductSubcategory ProductSubCategory ON ProductTable.ProductSubcategoryID = ProductSubCategory.ProductSubcategoryID JOIN Production.ProductCategory ProductCategory ON ProductSubCategory.ProductCategoryID = ProductCategory.ProductCategoryID WHERE ProductCategory.Name = 'Bikes' GROUP BY OrderTable.ProductID, ProductTable.Name ORDER BY TotalUnitsSold DESC SELECT ProductSubcategory.Name SubCategoryName, SUM(OrderQty) TotalUnitsSold FROM Sales.SalesOrderDetail OrderTable JOIN Production.Product ProductTable ON ProductTable.ProductID = OrderTable.ProductID JOIN Production.ProductSubcategory ProductSubCategory ON ProductTable.ProductSubcategoryID = ProductSubCategory.ProductSubcategoryID WHERE ProductSubcategory.Name LIKE '%bike%' AND ProductSubcategory.Name NOT LIKE '%bike rack%' AND ProductSubcategory.Name NOT LIKE '%bike stand%' GROUP BY ProductSubcategory.Name ORDER BY TotalUnitsSold DESC SELECT st.Name AS TerritoryName, st.CountryRegionCode, SUM(soh.TotalDue) AS TotalSales FROM Sales.SalesOrderHeader soh JOIN Sales.SalesTerritory st ON soh.TerritoryID = st.TerritoryID GROUP BY st.Name, st.CountryRegionCode ORDER BY TotalSales DESC ","date":"2025-09-10T00:00:00Z","image":"https://arnoldant.github.io/blog/p/building-my-first-sales-dashboard-in-power-bi/cover_hu_df61c10a6045e4c8.png","permalink":"https://arnoldant.github.io/blog/p/building-my-first-sales-dashboard-in-power-bi/","title":"Building My First Sales Dashboard in Power BI"},{"content":"This week’s update brought some big changes to the game, both in terms of enemies and new gameplay systems.\n🦴 The Guard Skeleton\nI introduced a brand-new enemy type: the Guard Skeleton.\nEquipped with a spear and shield\nShield can block attacks, making combat more strategic\nPatrols the area and chases the player once spotted\nThis enemy is meant to feel tougher and more tactical than the regular ones, adding variety to encounters.\n💚 Slime Overhaul\nThe Slime also received an upgrade.\nCleaner, more efficient code behind the scenes\nImproved animations for smoother movement\nAdded particle effects to give it more personality\nIt feels a lot more alive now, and it’s fun watching it bounce around.\n🕺 The Dancing Room\nThe biggest addition is the Dancing Room, a brand-new minigame!\nInspired by DDR-style rhythm gameplay\nFeatures dance animations for the player character\nAdds a lighthearted, fun change of pace from the usual combat\nThis was a big step toward making the game feel more varied and unique.\nWhat’s Next?\nI\u0026rsquo;m planning to work on the ring abilities and to add more variety to the environment, so stay tuned!\nThanks for following along with the development. If you’ve got ideas, feedback, or just want to cheer the project on, I’d love to hear from you.\n","date":"2025-09-08T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/game-devlog-9/08/2025/","title":"Game Devlog 9/08/2025"},{"content":"🔥 Devlog Update – New Abilities, Sticky Terrain \u0026amp; Dungeon Progress! 🔥\nSince the last update, I’ve been grinding away under the hood and adding a ton of new mechanics and systems to the game:\n⚔️ Code \u0026amp; Systems Updates\nReworked player states and grapple system for smoother transitions.\nImproved how special terrain interacts with movement.\nOptimized under-the-hood code for better performance.\n🏰 Dungeon Expansion\nAdded a new dungeon room with unique layouts.\nSpecial terrain now plays a bigger role in exploration and challenge.\n🔥 New Fire Abilities\nFlame Double Jump – launch yourself with a fiery boost! Does damage to unfortunate souls beneath you.\nFire Shotgun – unleash a blast of pellet-like flames to clear enemies up close.\n🕸️ Sticky Terrain\nA new environmental hazard: sticky ground that reduces your mobility and jump height, forcing more careful platforming and combat decisions. There’s still a lot to come, but I’m super excited about the direction the game is taking. Let me know what you think of the new abilities and terrain system!\n","date":"2025-08-28T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/game-devlog-8/28/2025/","title":"Game Devlog 8/28/2025"},{"content":"It’s been a packed week of development, and the game is starting to feel more alive with each update. Here’s a breakdown of everything I’ve added since last time:\n🏠 Placeholder Main Menu\nThe project finally has a main menu! It’s simple for now, but it includes the basics: Start, Options, and Exit. This small step makes the game feel more like a complete experience instead of just jumping straight into gameplay.\n❤️ Classic Zelda-Style Health System\nI’ve swapped out the old placeholder health bar for a heart-based system, inspired by the classics. Each heart represents a chunk of health, and losing them feels satisfying and clear in a way that fits the game’s retro-inspired style.\n⚡ New Lightning Abilities\nThe main character’s powers continue to evolve with two huge new additions:\nTriple Lightning Strike – With the lightning ring equipped, you can now call down three bolts of destruction, chaining your power together for massive damage.\nAerial Lightning Slam – Jump into the air and crash down, unleashing a thunderous lightning blast that strikes both enemies and the ground itself.\nBoth moves make combat feel more dynamic and give you more tools for chaining attacks together.\n🗝️ Secret Areas \u0026amp; Treasure\nExploration just got more rewarding. I’ve added hidden rooms tucked away behind destructible terrain. If you’re curious enough to search, you’ll find secret chests waiting with valuable loot. This adds a nice layer of discovery and makes exploration more engaging.\n👾 New Enemy: The Spewer\nA fresh foe enters the battlefield: the Spewer.\nIt burrows underground to reposition.\nPops up to spit poison projectiles.\nForces you to stay mobile and adapt.\nIt’s a fun twist compared to the melee-focused enemies so far and adds variety to combat encounters.\n💡 Lighting \u0026amp; Shadows\nTo improve atmosphere, I’ve implemented dynamic lighting with terrain casting shadows. This small change makes the world feel richer and adds depth to caves, secret areas, and combat arenas.\n✅ What’s Next?\nWith combat, exploration, and visual polish all improving, the game is slowly shaping into something cohesive. Next up, I’ll be refining the feel of combat even more and expanding enemy variety.\nThanks for following along! This week’s changes made a huge difference in how the game plays and feels. Can’t wait to show you what’s coming next!\n","date":"2025-08-22T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/game-devlog-8/22/2025/","title":"Game Devlog 8/22/2025"},{"content":"It’s been a while since I’ve worked on a personal project using Tableau and SQL, but I finally had a chance to dive back in with a dataset that caught my interest: Airbnb listings across New York City’s four major boroughs.\nUsing SQL to clean and explore the data, I built a Tableau dashboard to visualize key insights, including:\nThe number of listings per borough\nThe highest and lowest Airbnb prices by borough\nThe top 5 and lowest 5 rated listings based on star ratings\nIt was a great way to practice combining SQL and Tableau while uncovering interesting patterns in NYC’s short-term rental market. I’m excited to share the dashboard and insights from this project, and I look forward to continuing to explore real-world datasets in creative ways.\nSoftware used: SQL, DuckDB, DBeaver, Tableau Desktop\nAirbnb Dashboard Tableau Public\n","date":"2025-08-15T00:00:00Z","image":"https://arnoldant.github.io/blog/p/data-cleaning/visualization/cover_hu_c3867467ab20bce4.png","permalink":"https://arnoldant.github.io/blog/p/data-cleaning/visualization/","title":"Data Cleaning/Visualization"},{"content":"I’m excited to share the first gameplay video from my 2D pixel roguelite game! Right now, the character has a basic punch, a grapple swing mechanic, and just three rooms to explore, but it’s already fun to see everything coming together.\nIn this clip, you’ll get a glimpse of the movement and combat mechanics, including grappling through rooms and defeating the first slime enemy. It’s still early days, but seeing the mechanics in action really brings the world I’m building to life.\nI’ll be sharing more updates as the game grows, with new abilities, enemies, and levels. It’s exciting to finally give a peek behind the curtain at how the game is shaping up!\nSoftware used: Python, Godot Engine, Aseprite\n","date":"2025-08-15T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/game-devlog-8/15/2025/","title":"Game Devlog 8/15/2025"},{"content":"It’s been a while since I last shared a project here. Life got busy, and I stepped away from posting updates for longer than I planned. I’m sorry for the hiatus, but I’m excited to be back with something a little different this time.\nWhile most of my past posts have focused on data analysis, SQL, and R, I’ve recently revisited a long-time passion of mine: game development. Over the past few months, I’ve been working on a 2D pixel video game with roguelite mechanics, lightning-based abilities, and a story that balances lighthearted moments with a touch of tragedy. It’s been an amazing creative challenge, completely different from my usual analytical projects, but just as rewarding.\nI’ll be sharing more updates on this game and new data-driven projects soon. Thanks for sticking around during the break, and I’m excited to bring more to this space again!\nSoftware used: Python, Godot Engine, Aseprite\n","date":"2025-08-06T00:00:00Z","image":"https://arnoldant.github.io/blog/p/introduction-to-my-biggest-project/cover_hu_853b8719648e3f4b.gif","permalink":"https://arnoldant.github.io/blog/p/introduction-to-my-biggest-project/","title":"Introduction to my Biggest Project"},{"content":"In this project, the concept of artificial neural networks will be reviewed and applied to a binary image classification problem. First, an in-depth description of neural networks is done, fundamentally defining the key components of their structure and the mathematical concepts used to construct them. The concepts involving activation functions, gradient descent, and backpropagation will also be touched upon. In addition, customizable variables will be introduced to deter overfitting and enable user-led optimization practices. This information would then be used to define convolutional neural networks and what enables them to be effective at feature detection. Finally, a binary image classification example using Python and the Keras library is showcased to show the effectiveness of neural networks in solving real-world problems. This example implements image pattern recognition to classify whether a patient has pneumonia based on X-Ray images.\nSoftware used: Python, Keras, Kaggle, TensorFlow, matplotlib\nNeural Networks Research Paper\n","date":"2024-04-10T00:00:00Z","image":"https://arnoldant.github.io/blog/p/research-neural-networks-and-image-classification/cover_hu_c09a720f37c81d22.jpg","permalink":"https://arnoldant.github.io/blog/p/research-neural-networks-and-image-classification/","title":"Research - Neural Networks and Image Classification"},{"content":"With the expansive selection of food items necessary for survival, it is important to understand the breakdown of nutrients within them. Complexity plagues the nutritional makeup of even the simplest food products, causing avoidance and confusion when diving deeper into dietary facts. In this project, the aim is to bridge the gap between the foods loved by all and the nutrients nested within them. Creating a relational database to hold nutrient and product information would act as a reliable resource to monitor, update, and add relations that easily connect foods with their nutritional facts. Users can query the database to find foods based on various criteria such as fiber content, calorie amount, fat content, iron content, etc. The implementation of a nutritional database would also promote healthier lifestyles, making it a very useful tool to use daily.\nSoftware used: SQL, Microsoft SQL Server, Google Suite\nNutritional Database Schematic\n","date":"2023-12-01T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/nutritional-database-creation-project/","title":"Nutritional Database Creation Project"},{"content":"This is a final project for Topological Data Analysis, a class I took in Spring 2023. The project consisted of analyzing the real projective plane (RP2), which is a topological space that can be portrayed in a 3-D space. This project did involve teamwork and coding using the topology packages in R studio. Although the computation portion has been lost, here you can find the code and a piece of the presentation.\nSoftware used: R Studio, Microsoft Powerpoint\nTDA Real Projective Plane Code\nTDA Real Projective Plane Powerpoint\n","date":"2023-07-03T00:00:00Z","image":"https://arnoldant.github.io/blog/p/topological-data-analysis-homology-of-the-real-projective-plane/cover_hu_59be146b176bf7c7.jpg","permalink":"https://arnoldant.github.io/blog/p/topological-data-analysis-homology-of-the-real-projective-plane/","title":"Topological Data Analysis - Homology of the Real Projective Plane"},{"content":"This is an extension of the previous COVID-19 Case Analysis. Diving deeper into the data presented, I used SQL Server Management Studio (SSMS) and Tableau to organize and visualize key data that shows the differences of COVID-19 vaccination and death rates among income classes.\nSoftware used: Microsoft Excel, SQL Server Management Studio (SSMS), Tableau\nCOVID-19 Analysis SQL Code\nCOVID-19 Analysis Tableau Dashboard\n","date":"2023-06-29T00:00:00Z","image":"https://arnoldant.github.io/blog/p/covid-19-case-analysis-pt2-income-class/cover_hu_d306dbdcb3cd04ac.jpg","permalink":"https://arnoldant.github.io/blog/p/covid-19-case-analysis-pt2-income-class/","title":"COVID-19 Case Analysis PT2 Income Class"},{"content":"The objective of this project is to analyze the early pandemic data of COVID-19 cases for five counties in the state of Florida using Microsoft Excel. The analysis will consist of the modeling of positive cases over a period (days) and the estimation of the growth rates for each county. Also, each county will be compared with one another to find similarities and/or differences. The exploration of possible causes of said comparisons will be highlighted in the analysis process as well\u0026hellip;\nThe rest of the report can be found in the link below.\nSoftware used: Microsoft Excel\nCOVID-19 Case Analysis Report\n","date":"2023-06-26T00:00:00Z","permalink":"https://arnoldant.github.io/blog/p/early-pandemic-covid-19-case-analysis/","title":"Early Pandemic COVID-19 Case Analysis"}]