In a large stockpot or Dutch oven, combine the diced potatoes, celery, onion, ham, and water. Bring the mixture to a boil over high heat, then reduce the heat to medium-low and let it simmer for 10 to 15 minutes, until the potatoes are tender when pierced with a fork.
Stir in the chicken bouillon granules, salt, and pepper, making sure they are fully dissolved into the broth.
In a separate medium saucepan, melt the butter over medium-low heat. Once the butter is melted and bubbly, whisk in the flour to form a smooth paste, cooking and stirring for about 1 minute to remove the raw flour taste.
Slowly whisk the milk into the butter and flour mixture, continuing to whisk constantly to prevent lumps. Cook and stir until the mixture thickens, about 4 to 5 minutes; it should be smooth and coat the back of a spoon.
Pour the milk mixture (the white sauce) into the stockpot with the potato and ham mixture. Stir everything together thoroughly to combine.
Continue to cook the soup over medium heat, stirring occasionally, until it is fully heated through, about 5 more minutes. The soup will be creamy and thick.